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

 

在前面的示例中,我们在自定义的 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 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 paramMap = new HashMap<>();
    paramMap.put("userId", userId);
​
    return list(sql, paramMap, String.class);
}

 

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

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

 

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

史上最简单的Spring Security教程(十四):动态权限(自定义UserDetailsService)_第1张图片

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

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

 

源码

 

github

 

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

 

gitee

 

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

 

 

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

 

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

 

 

 

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

 

你可能感兴趣的:(Web安全,日积月累)