[spring] Spring MVC - security(下)

[spring] Spring MVC - security(下)

callback 一下,当前项目结构如下:

在这里插入图片描述

这里实现的功能是连接数据库,大范围和 [spring] rest api security 重合

数据库连接 - 明文密码

第一部分使用明文密码

设置数据库

主要就是运行 SQL:

USE `employee_directory`;DROP TABLE IF EXISTS `authorities`;
DROP TABLE IF EXISTS `users`;--
-- Table structure for table `users`
--CREATE TABLE `users` (`username` varchar(50) NOT NULL,`password` varchar(50) NOT NULL,`enabled` tinyint NOT NULL,PRIMARY KEY (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;--
-- Inserting data for table `users`
--INSERT INTO `users`
VALUES
('john','{noop}test123',1),
('mary','{noop}test123',1),
('susan','{noop}test123',1);--
-- Table structure for table `authorities`
--CREATE TABLE `authorities` (`username` varchar(50) NOT NULL,`authority` varchar(50) NOT NULL,UNIQUE KEY `authorities_idx_1` (`username`,`authority`),CONSTRAINT `authorities_ibfk_1` FOREIGN KEY (`username`) REFERENCES `users` (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;--
-- Inserting data for table `authorities`
--INSERT INTO `authorities`
VALUES
('john','ROLE_EMPLOYEE'),
('mary','ROLE_EMPLOYEE'),
('mary','ROLE_MANAGER'),
('susan','ROLE_EMPLOYEE'),
('susan','ROLE_MANAGER'),
('susan','ROLE_ADMIN');

运行结果如下:

在这里插入图片描述

以及目前的 ER 图:

在这里插入图片描述

添加 maven 依赖

新增的依赖如下:

		<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><scope>runtime</scope></dependency>

修改 properties 文件

这里具体的数据库/用户名/密码和本地设置有关,除此之外新增了一个 logging.level.org.springframework.jdbc.core=TRACE,这个设置是为了增加连接数据库的 logging 的,主要作用是 demo/debug

spring.application.name=demo# JDBC properties
spring.datasource.url=jdbc:mysql://localhost:3306/employee_directory
spring.datasource.username=springstudent
spring.datasource.password=springstudent
spring.jpa.database-platform=org.hibernate.dialect.MySQLDialect# log JDBC SQL statements
# only use this for dev/testing purpose
logging.level.org.springframework.jdbc.core=TRACE

更新 security config

之前用的是 InMemoryUserDetailsManager,代表用的是内存中的用户名和密码。这里需要吧 InMemoryUserDetailsManager 注释掉,更换成 UserDetailsManager

具体实现如下:

    @Beanpublic UserDetailsManager userDetailsManager(DataSource dataSource) {return new JdbcUserDetailsManager(dataSource);}

执行的 sql 指令如下:

在这里插入图片描述

这代表着现在已经使用数据库连接而非内存中写死的用户名和密码

数据库连接 - bcrypt 密码

这里的配置其实和明文密码基本一样,最大的差别在于写入数据库的密码

明文中存入的数据为 {noop}test123, 而 bcrypt 中写入的数据为加密后的哈希值: bcrypt}$2a$10$qeS0HEh7urweMojsnwNAR.vcXJeXR1UcMRZ2WcGQl9YeuspUdgF.q

bcrypt 是一种密码加密方式,其主要的优点在于,因为 salt 不是固定的,因此同样的密码会生成不同的哈希值

具体的实现这里不过多涉及

设置数据库

USE `employee_directory`;DROP TABLE IF EXISTS `authorities`;
DROP TABLE IF EXISTS `users`;--
-- Table structure for table `users`
--CREATE TABLE `users` (`username` varchar(50) NOT NULL,`password` char(68) NOT NULL,`enabled` tinyint NOT NULL,PRIMARY KEY (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;--
-- Inserting data for table `users`
--
-- NOTE: The passwords are encrypted using BCrypt
--
-- A generation tool is avail at: https://www.luv2code.com/generate-bcrypt-password
--
-- Default passwords here are: fun123
--INSERT INTO `users`
VALUES
('john','{bcrypt}$2a$10$qeS0HEh7urweMojsnwNAR.vcXJeXR1UcMRZ2WcGQl9YeuspUdgF.q',1),
('mary','{bcrypt}$2a$10$qeS0HEh7urweMojsnwNAR.vcXJeXR1UcMRZ2WcGQl9YeuspUdgF.q',1),
('susan','{bcrypt}$2a$10$qeS0HEh7urweMojsnwNAR.vcXJeXR1UcMRZ2WcGQl9YeuspUdgF.q',1);--
-- Table structure for table `authorities`
--CREATE TABLE `authorities` (`username` varchar(50) NOT NULL,`authority` varchar(50) NOT NULL,UNIQUE KEY `authorities4_idx_1` (`username`,`authority`),CONSTRAINT `authorities4_ibfk_1` FOREIGN KEY (`username`) REFERENCES `users` (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;--
-- Inserting data for table `authorities`
--INSERT INTO `authorities`
VALUES
('john','ROLE_EMPLOYEE'),
('mary','ROLE_EMPLOYEE'),
('mary','ROLE_MANAGER'),
('susan','ROLE_EMPLOYEE'),
('susan','ROLE_MANAGER'),
('susan','ROLE_ADMIN');

代码方面同样不需要任何的修改,效果如下:

在这里插入图片描述

⚠️:这里数据库中的密码换成了 bcrypt 加密后的密码

在这里插入图片描述

⚠️:这里是用原本的密码登录会报错——?error 证明了用户名和密码不符合数据库中数据,下面使用更新过的用户名和密码则可以登录

在这里插入图片描述

使用自定义表

前面的实现都是用默认的 spring boot 实现,即用户的表为 users,而权限的表单为 authorities。但是在实际的应用场景中,更多的业务情况是需要使用更特定的表名。spring 同样也有对这个需求的支持,其实现方式则需要写少量的 sql 语句

更新数据库

这里主要新建两个平行的数据库分别取代 usersauthorities

USE `employee_directory`;DROP TABLE IF EXISTS `roles`;
DROP TABLE IF EXISTS `members`;--
-- Table structure for table `members`
--CREATE TABLE `members` (`user_id` varchar(50) NOT NULL,`pw` char(68) NOT NULL,`active` tinyint NOT NULL,PRIMARY KEY (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;--
-- Inserting data for table `members`
--
-- NOTE: The passwords are encrypted using BCrypt
--
-- A generation tool is avail at: https://www.luv2code.com/generate-bcrypt-password
--
-- Default passwords here are: fun123
--INSERT INTO `members`
VALUES
('john','{bcrypt}$2a$10$qeS0HEh7urweMojsnwNAR.vcXJeXR1UcMRZ2WcGQl9YeuspUdgF.q',1),
('mary','{bcrypt}$2a$10$qeS0HEh7urweMojsnwNAR.vcXJeXR1UcMRZ2WcGQl9YeuspUdgF.q',1),
('susan','{bcrypt}$2a$10$qeS0HEh7urweMojsnwNAR.vcXJeXR1UcMRZ2WcGQl9YeuspUdgF.q',1);--
-- Table structure for table `authorities`
--CREATE TABLE `roles` (`user_id` varchar(50) NOT NULL,`role` varchar(50) NOT NULL,UNIQUE KEY `authorities5_idx_1` (`user_id`,`role`),CONSTRAINT `authorities5_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `members` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;--
-- Inserting data for table `roles`
--INSERT INTO `roles`
VALUES
('john','ROLE_EMPLOYEE'),
('mary','ROLE_EMPLOYEE'),
('mary','ROLE_MANAGER'),
('susan','ROLE_EMPLOYEE'),
('susan','ROLE_MANAGER'),
('susan','ROLE_ADMIN');

实现后的 ER 图如下:

在这里插入图片描述

配置 security config 使用自定义表单

这里需要更新的也是 userDetailsManager,之前是直接返回 jdbcUserDetailsManager,让其运行默认的 sql 语句,这里则是写一点 sql 语句,重写默认的执行语句:

    @Beanpublic UserDetailsManager userDetailsManager(DataSource dataSource) {JdbcUserDetailsManager jdbcUserDetailsManager = new JdbcUserDetailsManager(dataSource);// define query to retrieve a user by usernamejdbcUserDetailsManager.setUsersByUsernameQuery("select user_id, pw, active from members where user_id=?");// define query to retrieve the authorities/roles by usernamejdbcUserDetailsManager.setAuthoritiesByUsernameQuery("select user_id, role from roles where user_id=?");return jdbcUserDetailsManager;}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/43144.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

内存与硬盘(笔记)

文章目录 1. 内存① 笔记② 相关软件 2. 硬盘① 笔记② 相关软件 3. 区别&#xff1a;4. 推荐 1. 内存 ① 笔记 ① 笔记本的内存条和台式机的内存条是不互通的 ② 我们常说的内存其实指的是运行内存(前台后台同时能运行多少APP) ③ 下图来自京东&#xff1a; 解析&#xff1…

应用程序提权

MYSQL提权 Mysql提权利用场景 1.拥有数据库账号密码 2.Webshell可以连接数据库&#xff0c;能够写文件 3.可操作数据库 如何获取数据库账号密码? 1.找数据库配置文件 2.通过webshell对数据库进行本地爆破 3.Hash获取mysql密码 UDF提权 udf提权指的是利用注…

ubuntu 分区情况

ubuntu系统安装与分区指南 - Philbert - 博客园 (cnblogs.com)https://www.cnblogs.com/liangxuran/p/14872811.html 详解安装Ubuntu Linux系统时硬盘分区最合理的方法-腾讯云开发者社区-腾讯云 (tencent.com)https://cloud.tencent.com/developer/article/1711884

pycharm中快捷键汇总

Pycarm指令汇总 Ctrl鼠标 单击&#xff0c;能直接查看其用法 Ctrl/ 快速注释 CtrlC 在pycharm的terminal中可以停止运行, 其他的地方可以复制。 CtrlV 粘贴 CtrlA 全选 CtrlP 查看&#xff08;&#xff09;中需要填写什么参数 Altenter 自动不补全所需要的库

终于找到了免费的C盘清理软件(极智C盘清理)

搜了很久&#xff0c;终于让我找到了一款 完全免费的C盘清理软件&#xff08;极智C盘清理&#xff09;。 点击前往官网免费使用极智C盘清理软件&#xff1a; C盘清理 用户好评 完全免费的极智C盘清理 用极智C盘清理清理了下系统的临时文件、缓存等无用数据文件&#xff0c;C盘终…

尚硅谷大事件后台API项目(学习自用)

大事件后台API项目 1.初始化 1.1创建项目 首先创建一个文件夹名为api_server&#xff0c;然后用vscode打开这个文件夹&#xff0c;新建终端&#xff0c;在终端输入npm init -y会生成一个package.json文件&#xff0c;接着新建一个文件app.js作为入口文件&#xff0c;在终端安…

哈尔滨等保测评标准的国际比较与启示

随着信息技术的快速发展和全球化趋势的加深&#xff0c;信息安全成为各国政府和企业共同关注的焦点。哈尔滨作为东北地区重要的经济和科技中心&#xff0c;其信息安全等级保护&#xff08;简称“等保”&#xff09;测评标准在确保本地企业信息安全的同时&#xff0c;也面临着与…

Could not find a package configuration file provided by “Torch“ 的参考解决方法

文章目录 写在前面一、问题描述二、解决方法参考链接 写在前面 自己的测试环境&#xff1a; Ubuntu20.04 一、问题描述 自己编译调用 Torch 的程序时&#xff0c;遇到如下报错&#xff1a; Make Error at CMakeLists.txt:15 (find_package):By not providing "FindTor…

设计资料:520-基于ZU15EG 适配AWR2243的雷达验证底板 高速信号处理板 AWR2243毫米波板

基于ZU15EG 适配AWR2243的雷达验证底板 一、板卡概述 本板卡系北京太速科技自主研发&#xff0c;基于MPSOC系列SOC XCZU15EG-FFVB1156架构&#xff0c;搭载两组64-bit DDR4&#xff0c;每组容量32Gb&#xff0c;最高可稳定运行在2400MT/s。另有1路10G SFP光纤接口、1路40G…

使用F1C200S从零制作掌机之构建debian文件系统

前情&#xff1a;使用buildrootfs构建的文件系统调试了很久NES模拟器&#xff0c;执行InfoNES模拟器的时候一直黑屏&#xff0c;无内容显示&#xff0c;调不通了&#xff0c;所以改用debian系统试试。 一、环境配置 首先下载两个工具&#xff1a;qemu-arm-static和debootstra…

uniapp小程序上传文件

需求 小程序需要上传用户相册图片或拍摄的照片到后端服务器 uniapp官方处理小程序文件方法 选择文件方法&#xff1a;uni.chooseMedia uni-app官网uni-app,uniCloud,serverless,uni.chooseVideo(OBJECT),chooseVideo HarmonyOS 兼容性,uni.chooseMedia(OBJECT),uni.saveVid…

Android:如何绘制View

点击查看Android 如何绘制视图官网 一、简介 Android 框架会在 Activity 获得焦点时请求 Activity 绘制其布局。Android 框架会处理绘制流程&#xff0c;但该 Activity 必须提供其布局层次结构的根节点。 Android 框架会绘制布局的根节点&#xff0c;并测量和绘制布局树。它会…

React@16.x(51)路由v5.x(16)- 手动实现文件目录参考

作为前面几篇文章的参考&#xff1a; 实现 Router实现 Route实现 Switch实现 withRouter实现 Link 和 NavLink 以上。

一.4 处理器读并解释储存在内存中的指令

此刻&#xff0c;hello.c源程序已经被编译系统翻译成了可执行目标文件hello&#xff0c;并被存放在硬盘上。要想在Unix系统上运行该可执行文件&#xff0c;我们将它的文件名输入到称为shell的应用程序中&#xff1a; linux>./hello hello, world linux> shell是一个命令…

深度优先搜索和广度优先搜索 使用场景

深度优先搜索&#xff08;Depth-First Search, DFS&#xff09;和广度优先搜索&#xff08;Breadth-First Search, BFS&#xff09;是图和树结构中常用的遍历算法。两者适用于不同的场景。 深度优先搜索 优点 较低的空间复杂度&#xff08;只需保存当前路径&#xff09;&…

JS实现当前元素的同级元素 以及父元素的同级元素

<!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>实现当前元素的同级元素 以及父元素的同级元素</t…

一.2.(4)放大电路静态工作点的稳定;

1.Rb对Q点及Au的影响 输入特性曲线&#xff1a;Rb减少&#xff0c;IBQ&#xff0c;UBEQ增大 输出特性曲线&#xff1a;ICQ增大&#xff0c;UCEQ减少 AUUO/Ui分子减少&#xff0c;分母增大&#xff0c;但由于分子带负号&#xff0c;所以|Au|减少 2.Rc对Q点及Au的影响 输入特性曲…

用Vue3和Plotly.js绘制交互式3D小提琴图

本文由ScriptEcho平台提供技术支持 项目地址&#xff1a;传送门 Vue 中使用 Plotly.js 创建小提琴图 应用场景介绍 小提琴图是一种统计图&#xff0c;用于显示数据的分布和中心趋势。它结合了箱线图和密度图的特点&#xff0c;可以直观地展示数据的分散性和形状。 代码基本…

【网络协议】OSPF

OSPF OSPF&#xff08;Open Shortest Path First&#xff09;协议是一种广泛使用的动态路由协议&#xff0c;它属于链路状态路由协议&#xff0c;在单一自治系统&#xff08;AS&#xff09;内部工作。以下是关于OSPF协议的详细解析&#xff1a; 一、基本概念 定义&#xff1…

使用Keil 点亮LED灯 F103ZET6

1.新建项目 不截图了 2.startup_stm32f10x_hd.s Keil\Packs\Keil\STM32F1xx_DFP\2.2.0\Device\Source\ARM 搜索startup_stm32f10x_hd.s 复制到项目路径&#xff0c;双击Source Group 1 3.项目文件夹新建stm32f10x.h&#xff0c; 新建文件main.c #include "stm32f10x…