欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

史上最简单的Spring Security教程(十四):动态权限(自定义UserDetailsService)

程序员文章站 2022-06-02 23:25:49
...

 

在前面的示例中,我们在自定义的 UserDetailsService 中,固化了用户所拥有的的权限,即 User。其实,这和最早我们在配置文件配置用户的用户名、密码、权限列表并无二致,这种固化的方法尤其独到之处,但却并不适合所有业务场景。

本例,我们来说一下如何实现动态权限。

首先,定义角色表、角色用户关联表

create table SYS_ROLE
(
    ID                   varchar(32) not null comment '主键',
    NAME                 varchar(60) comment '角色名称',
    CODE                 varchar(60) comment '角色标识',
    GMT_CREATE           timestamp default CURRENT_TIMESTAMP comment '新增时间,默认当前时间,不随数据改变而改变',
    GMT_MODIFIED         timestamp default CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP comment '修改时间,默认当前时间,随数据改变而改变',
    primary key (ID)
);
​
alter table SYS_ROLE comment '系统角色';
create table SYS_USER_ROLE
(
    ID                   varchar(32) not null comment '主键',
    USER_ID              varchar(32) comment '用户ID',
    ROLE_ID              varchar(32) comment '角色ID',
    primary key (ID)
);
​
alter table SYS_USER_ROLE comment '用户角色';

 

然后,新增 RoleDao ,并新增查询当前用户角色列表的方法。

public List<String> listRoleCodeByUserId(String userId) {
    String sql = "select sys_role.code\n" +
                "  from sys_role, sys_user_role\n" +
                " where sys_role.id = sys_user_role.role_id\n" +
                "   and sys_user_role.user_id = :userId";
​
    Map<String, Object> paramMap = new HashMap<>();
    paramMap.put("userId", userId);
​
    return list(sql, paramMap, String.class);
}

 

最后,修改自定义 UserDetailsService,使用 RoleDao 动态获取当前用户角色列表。

List<String> roles = this.roleDao.listRoleCodeByUserId(sysUser.getId());
​
if (!CollectionUtils.isEmpty(roles)) {
     builder.roles(roles.toArray(new String[] {}));
}

 

所以准备操作就绪,启动系统,访问个人中心,输入用户名、密码后,即可以正常访问,说明权限获取成功。

史上最简单的Spring Security教程(十四):动态权限(自定义UserDetailsService)

如果要添加其它权限,只需维护 角色、用户角色关联 表的数据即可(至少目前是这样,因为我们还没有提供可以通过系统操作的功能)。

其它详细源码,请参考文末源码链接,可自行下载后阅读。

 

源码

 

github

 

https://github.com/liuminglei/SpringSecurityLearning/tree/master/14

 

gitee

 

https://gitee.com/xbd521/SpringSecurityLearning/tree/master/14

 

 

史上最简单的Spring Security教程(十四):动态权限(自定义UserDetailsService)

回复以下关键字,获取更多资源

 

SpringCloud进阶之路 | Java 基础 | 微服务 | JAVA WEB | JAVA 进阶 | JAVA 面试 | MK 精讲

史上最简单的Spring Security教程(十四):动态权限(自定义UserDetailsService)

 

 

 

笔者开通了个人微信公众号【银河架构师】,分享工作、生活过程中的心得体会,填坑指南,技术感悟等内容,会比博客提前更新,欢迎订阅。

史上最简单的Spring Security教程(十四):动态权限(自定义UserDetailsService)