当前位置: 代码迷 >> 综合 >> SpringBoot2.0实战(17)整合SpringSecurity基于数据库登录鉴权
  详细解决方案

SpringBoot2.0实战(17)整合SpringSecurity基于数据库登录鉴权

热度:142   发布时间:2023-09-29 02:54:08.0

通过前一篇文章 整合SpringSecurity之最简登录及方法鉴权,我们已经可以简单地使用 SpringSecurity 对应用实现登录鉴权,但是问题在于,用户信息或者是在配置文件中,或者是在代码中写死,应用启动后被加载至内存,这并不符合实际的生产需要,在实际的生产应用中,我们需要使用数据库对用户及角色信息进行持久化,在执行登录操作时,从数据库中获取用户信息。

目标

整合 SpringSecurity 及 MybatisPlus 实现使用读取数据库数据进行登陆鉴权

准备工作

创建用户表 s_user、角色表 s_role、用户角色关系表 s_user_role

CREATE TABLE `s_role` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `CREATE_ID` int(11) DEFAULT NULL,
  `CREATE_TIME` datetime DEFAULT NULL,
  `UPDATE_ID` int(11) DEFAULT NULL,
  `UPDATE_TIME` datetime DEFAULT NULL,
  `CODE` varchar(32) COLLATE utf8_bin DEFAULT NULL COMMENT '角色编码',
  `ROLE_NAME` varchar(64) COLLATE utf8_bin DEFAULT NULL COMMENT '角色名称',
  `STATE` int(2) DEFAULT '1' COMMENT '状态(1启用2禁用)',
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='角色表';

CREATE TABLE `s_user` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `CREATE_ID` int(11) DEFAULT NULL,
  `CREATE_TIME` datetime DEFAULT NULL,
  `UPDATE_ID` int(11) DEFAULT NULL,
  `UPDATE_TIME` datetime DEFAULT NULL,
  `USER_NAME` varchar(32) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '用户名',
  `PASSWORD` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '密码',
  `STATE` int(2) DEFAULT '1' COMMENT '用户状态(-1停用1正常2被锁定)',
  PRIMARY KEY (`ID`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='用户表';

CREATE TABLE `s_user_role` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `CREATE_ID` int(11) DEFAULT NULL,
  `CREATE_TIME` datetime DEFAULT NULL,
  `USER_ID` int(11) DEFAULT NULL COMMENT '用户外键',
  `ROLE_ID` int(11) DEFAULT NULL COMMENT '角色外键',
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='用户角色表';

操作步骤

添加依赖

SpringBoot2.0实战(17)整合SpringSecurity基于数据库登录鉴权

 

配置

配置一下数据源

SpringBoot2.0实战(17)整合SpringSecurity基于数据库登录鉴权

编码

实体类

角色实体类 Role,实现权限接口 GrantedAuthority

SpringBoot2.0实战(17)整合SpringSecurity基于数据库登录鉴权

用户实体类 user,实现权限接口 UserDetails,主要方法是 getAuthorities,用于获取用户的角色列表

SpringBoot2.0实战(17)整合SpringSecurity基于数据库登录鉴权

 

用户角色关系实体

SpringBoot2.0实战(17)整合SpringSecurity基于数据库登录鉴权

Repository 层

分别为三个实体类添加 Mapper

SpringBoot2.0实战(17)整合SpringSecurity基于数据库登录鉴权SpringBoot2.0实战(17)整合SpringSecurity基于数据库登录鉴权

SpringBoot2.0实战(17)整合SpringSecurity基于数据库登录鉴权

实现 UserDetailsService 接口

UserDetailsService 是 SpringSecurity 提供的登陆时用于根据用户名获取用户信息的接口

SpringBoot2.0实战(17)整合SpringSecurity基于数据库登录鉴权

 

权限配置

继承 SpringSecurity 提供的 WebSecurityConfigurerAdapter 配置 userDetailsService 及加密方式

SpringBoot2.0实战(17)整合SpringSecurity基于数据库登录鉴权

 

启动类

SpringBoot2.0实战(17)整合SpringSecurity基于数据库登录鉴权

 

验证结果

初始化数据

执行测试用例进行初始化数据

 

SpringBoot2.0实战(17)整合SpringSecurity基于数据库登录鉴权

校验

网页访问 http://localhost:8080,将自动跳转登录页,输入 user/123456 进行登录,可以使用 debugger 进行调试。

源码地址

本章源码 :https://github.com/caiyuanzi-song/boot.git

结束语

使用数据库进行鉴权,是实际应用中最基本的需求。

  相关解决方案