个人技术总结——SpringSecurity基于JWT的动态权限验证

本文详细介绍了如何使用SpringSecurity实现动态权限管理,包括基本鉴权逻辑、鉴权全流程和JWT获取用户角色信息。通过建立用户、角色、资源的三级动态管理,实现了动态权限验证,并使用JWT进行身份验证,确保了权限安全。此外,还分享了在抽象SecurityConfig类时遇到的问题及解决过程。
这个作业属于哪个课程 软件工程实践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;

    
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值