| 这个作业属于哪个课程 | 软件工程实践2022年春-W班 |
|---|---|
| 这个作业要求在哪里 | 软件工程实践总结&个人技术博客 |
| 这个作业的目标 | 课程回顾与总结 个人技术总结 |
| 其他参考文献 |
一、技术概述
绝大多数的软件应用都离不开权限安全,但是权限安全相关的代码在每个项目中又十分类似,因此我就编写了一个基于SpringSecurity的支持动态权限验证的权限安全模块的脚手架,并应用在我们的项目之中。
二、技术详述
1. 基本鉴权逻辑
首先要说明,该权限模块支持用户、角色、资源三级的动态权限管理,并且基于JWT可支持OAuth2.0的认证模型。因此我们第一步需要建出这三张主表以及关联表。



鉴权原理是查找用户所含有的所有角色中是否拥有对应资源的访问权限,最终都要靠resource表中的url进行鉴权,这里url是通配符匹配url,因为真正在判断url时我们使用Spring提供的AntPathRequestMatcher通配符匹配器对当前访问的资源路径进行判断和鉴权。

@Bean("dynamicSecurityService")
public DynamicSecurityService dynamicSecurityService(UmsResourceService umsResourceService){
return ()->{
Map<RequestMatcher, List<ConfigAttribute>> map = new ConcurrentHashMap<>();
//获取所有的资源和角色的对应关系
List<ResourceRoleBO> list = umsResourceService.getAllResourceRole();
for (ResourceRoleBO resource : list) {
//通配符匹配器
map.put(new AntPathRequestMatcher(resource.getUrl()),
//所有角色信息
resource.getRoleList().stream()
.map(role->new org.springframework.security.access.SecurityConfig(role.getName()))
.collect(Collectors.toList())
);
}
return map;
};
}
获取资源和角色sql语句
<select id="getAllResourceRole" resultMap="AllResourceRole">
SELECT
r.`id`,
r.`name`,
r.`url`,
rl.`name` rl_name
FROM ums_resource r
LEFT JOIN ums_role_resource_relation rrr ON rrr.`resource_id`=r.`id`
LEFT JOIN ums_role rl ON rl.`id`=rrr.`role_id`
WHERE rl.`name` IS NOT NULL
ORDER BY r.`id`
</select>
@Data
public class ResourceRoleBO extends UmsResource {
private List<UmsRole> roleList;
}
@Data
@EqualsAndHashCode(callSuper = false)
@TableName("ums_resource")
@ApiModel(value="UmsResource对象", description="")
public class UmsResource implements Serializable {
private static final long serialVersionUID=1L;

本文详细介绍了如何使用SpringSecurity实现动态权限管理,包括基本鉴权逻辑、鉴权全流程和JWT获取用户角色信息。通过建立用户、角色、资源的三级动态管理,实现了动态权限验证,并使用JWT进行身份验证,确保了权限安全。此外,还分享了在抽象SecurityConfig类时遇到的问题及解决过程。
最低0.47元/天 解锁文章
638

被折叠的 条评论
为什么被折叠?



