Spring Boot + Spring Security 实现通过数据库进行用户身份信息的认证以及授权
2020年12月24日更新:
最近在学习Spring Security时的一些问题总结,以及一个完整的demo示例。该demo示例,实现了通过mysql数据库进行用户身份信息的登录认证,以及页面的动态授权显示。
完整代码已上传至Gitee仓库,地址:Spring Boot-Spring Security-Demo
1.mysql数据库中的准备
1.1 建立数据库 db_authority
1.2 建立表 tb_user
表中字段为:id name password role
CREATE TABLE `tb_user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL COMMENT '用户名',
`password` varchar(255) DEFAULT NULL COMMENT '用户密码',
`role` varchar(255) DEFAULT NULL COMMENT '用户角色,所拥有的权限',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
2 建立Spring Boot项目
版本为: Spring Boot 2.4.1
Spring Security版本为: Spring Security 5
Mysql 数据库: MySql 8.0
初始化所勾选依赖jar包:
项目初始化完成。
2.1 编写项目配置文件
在路径 resources/application.yml
编辑 application.yml
文件
spring:
profiles:
active: dev
jpa:
show-sql: true
hibernate:
ddl-auto: none
thymeleaf:
cache: false
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/db_authority?serverTimezone=GMT%2B8
username: root
password: root
2.2 建立包 domain
在该包下,编写实体类 User
映射数据库的表 tb_user
, 实现spring security中内置的用户信息类 UserDetails
。
@Entity(name = "tb_user") //映射数据库中的tb_user表
@Data //Lombok注解,生成getter setter
public class User implements UserDetails {
@Id //标识为主键
@GeneratedValue(strategy = GenerationType.IDENTITY) //主键自增
private Long id;
private String name;
private String password;
private String role;
//返回用户信息中所有认证权限,用户权限集
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
//获取用户所有权限
String[] roles = role.split(",");
//取出所有的权限,并且给每个权限都要进行认证,添加到 SimpleGrantedAuthority()
List<SimpleGrantedAuthority> simpleGrantedAuthorities = new ArrayList<>();
//遍历roles,取出每一个权限,添加到 简单的授予认证类
for (String s : roles) {
//添加了 ROLE_ 前缀 为了前端页面thymeleaf-security 中自带的 hasRole()方法,能得到ROLE_格式的角色信息
simpleGrantedAuthorities.add(new SimpleGrantedAuthority(