一.前言
1.介绍
- 上文主要介绍了后端使用Spring Security对API进行保护
- 本文主要介绍Spring Security使用数据库存储角色和权限,并在此情况下进行登录操作,同时介绍了记住我操作
2.项目例子
- 此文章用到的例子在spring-boot项目中,传送门
- 此篇文章用到项目模块:
spring-boot-security-login
- 还有更多:spring-cloud项目
3.概述
- 使用数据库存储用户,角色和权限,代码中使用jpa进行数据库访问
- 自定义
UserDetailsService
用于登陆时获取用户信息 - 添加rememberMe记住我的功能
- sql文件在项目模块中
login.sql
- 基于上篇后端使用Spring Security对API进行保护添加登陆的新功能
二.Spring Security用户,角色和权限
1. 数据库表设计
- 用户,角色,权限,之间多对多关系
- 用户实体类,包含角色
@Entity @Table(name = "user_account") public class User { @Id @Column(unique = true, nullable = false) @GeneratedValue(strategy = GenerationType.AUTO) private Long id; private String firstName; private String lastName; private String email; @Column(length = 60) private String password; private boolean enabled; private boolean isUsing2FA; private String secret; @ManyToMany(fetch = FetchType.EAGER) @JoinTable(name = "users_roles", joinColumns = @JoinColumn(name = "user_id", referencedColumnName = "id"), inverseJoinColumns = @JoinColumn(name = "role_id", referencedColumnName = "id")) private Collection<Role> roles;
- 角色实体类,包含权限
@Entity public class Role { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; @ManyToMany(mappedBy = "roles") private Collection<User> users; @ManyToMany @JoinTable(name = "roles_privileges", joinColumns = @JoinColumn(name = "role_id", referencedColumnName = "id"), inverseJoinColumns = @JoinColumn(name = "privilege_id", referencedColumnName = "id")) private Collection<Privilege> privileges; private String name;
- 权限实体类
@Entity public class Privil