最近考虑项目权限控制问题,正好来学习下Spring Security,写个demo。
Spring Security通过Filter Chain过滤器链来实现访问权限的控制,简单需求下设置起来还是挺方便的。
数据库结构
数据库存放用户信息,权限和权限表,总共三张。
Role_user
Role_type
Role_user_role
利用Role_user_role中间表实现用户和权限类型间的多对多关系。
项目配置和结构
项目Maven设置了SpringBoot 2.2.6版本的依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.6.RELEASE</version>
<relativePath/>
</parent>
Spring Security引入
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
其它诸如mybatis,thymeleaf等依次引入即可,用spring initializr
的话会很方便。不过用spring initializr创建项目,项目的配置文件application默认为properties文件,高版本的SpringBoot中可能要额外进行配置文件的读取处理,建议改成yml
文件。
项目结构如图
其中bean中为实体类,dao中为mapper接口,security中为Spring Security设置类。
实体类
实体类其实就两个,user和role,user中包含list类型的role列表,按照数据表写就完了,这里不贴出来。
重点来看下RUser,该类实现了Spring Security提供的UserDetails接口。该接口实现类用来存放Spring Security维护的用户信息,框架本身也提供了一个User类,不过信息比较少,要满足需求需要自己定义实现类。
/*
该类实现userdetails.User类,方便spring security进行用户记录
*/
public class RUser implements UserDetails, Serializable {
private static final long serialVersionUID = 935664911799490702L;
User user;
public RUser(User user){
this.user = user;
}
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
List<Role> roles = user.getRoles();
if(!roles.isEmpty())