Bootstrap

Spring Security(五)角色权限管理基础

博主前言:本以为这个就是代替传统 jwt 的插件,没想到复杂程度如此之高。Spring Security 本身是个高度自定义化的组件,必须花时间重点学习一下。以下为个人配置学习的流程,从零到权限管理、redis嵌入等步骤。
本文基于尚硅谷的 Spring Security 教程学习,文章与原教程有不小出入,仅供参考。
B站视频链接:尚硅谷Java项目SpringSecurity+OAuth2权限管理实战教程

现阶段的项目,一般都包含管理端和用户端,管理端部分功能用户端是不能使用的,所以我们需要一套权限系统来实现。

回想起之前写提瓦特外卖的时光了,那时候也是双端,管理端和用户端。


一、权限简介及修改逻辑结构

授权管理的实现在 Spring Security 中非常灵活,可以帮助应用程序实现以下两种常见的授权需求:

  • 用户 - 权限 - 资源:例如张三的权限是添加用户、查看用户列表,李四的权限是查看用户列表
  • 用户 - 角色 - 资源:例如 张三是角色是管理员、李四的角色是普通用户,管理员能做所有操作,普通用户只能查看信息

对于用户,我们需要为其添加权限字段,供 Spring Security 来判断,每个用户可以拥有多个字段,对应多个权限。

我们先来改造一下User类,要求添加数据库排除的权限字段及重写对应接口方法:

实际上,该字段应该在数据库中体现,有些结构还配置有权限表进行一对多或多对多的链接。
此处为演示,简单写个字段,数据库中没有,需要被排除。

@TableField(exist = false)
private List<GrantedAuthority> authorities;

@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
    return authorities;
}

之后,我们重写用户信息维护服务中的装载用户方法,就可以为其写死一个权限:

@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
    var user = getByUsername(username);
    if (user == null)
        throw new UsernameNotFoundException("用户不存在:" + username);
    var authorityList = new ArrayList<GrantedAuthority>();
    // 这里以【用户 - 权限 - 资源】为例
    authorityList.add(() -> "USER_LIST");
    // 没有添加 USER_ADD 权限,为接下来的操作做区分
    user.setAuthorities(authorityList);
    return user;
}

更多内容请访问:个人博客传送门

;