在前面的示例中,我们在自定义的 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[] {}));
}
所以准备操作就绪,启动系统,访问个人中心,输入用户名、密码后,即可以正常访问,说明权限获取成功。
如果要添加其它权限,只需维护 角色、用户角色关联 表的数据即可(至少目前是这样,因为我们还没有提供可以通过系统操作的功能)。
其它详细源码,请参考文末源码链接,可自行下载后阅读。
https://github.com/liuminglei/SpringSecurityLearning/tree/master/14
https://gitee.com/xbd521/SpringSecurityLearning/tree/master/14
回复以下关键字,获取更多资源
SpringCloud进阶之路 | Java 基础 | 微服务 | JAVA WEB | JAVA 进阶 | JAVA 面试 | MK 精讲
笔者开通了个人微信公众号【银河架构师】,分享工作、生活过程中的心得体会,填坑指南,技术感悟等内容,会比博客提前更新,欢迎订阅。