SpringBoot整合SpringSecurity(八)动态权限

序言

SpringSecurity 进行的权限验证,有时候可能并不太满足我们的需求。有时候呢可能需要你自己去扩展达到一个对自己业务满意的验证,这时候怎么办呢?第一呢, 先不要百度,你要懂权限验证的一个流程,不懂的话可以去看我之前的博客,第二呢,就是放开手按照自己假象的思路去实践!

思路

我说一下我的需求,我想判断那个角色拥有某些url的权限,这时候该怎么进行扩展呢?

我的思路是对 自定义 AccessDecisionVoter 然后我们知道在 FilterSecurityInterceptor 里是从 SecurityMetadataSource 中拿到的权限配置项,知道了这些后,就可以做出扩展。

  1. 定义一个自己的SecurityMetadataSource 使其从数据库中查询权限自己构建 ConfigAttribute
  2. 定义一个具有自己需求的AccessDecisionVoter
  3. 规定一个自己的AccessDecisionManager

实践

SecurityMetadataSource

首先呢我们先定义一个自己的 SecurityMetadataSource ,然后每次调用的时候都去数据库里去查询。

public class DynamicFilterInvocationSecurityMetadataSource implements FilterInvocationSecurityMetadataSource {
   


    private FilterInvocationSecurityMetadataSource superMetadataSource;


    public DynamicFilterInvocationSecurityMetadataSource(FilterInvocationSecurityMetadataSource expressionBasedFilterInvocationSecurityMetadataSource) {
   
        this.superMetadataSource = expressionBasedFilterInvocationSecurityMetadataSource;
        //TODO 在这里去查询你的数据库
    }

    private final AntPathMatcher antPathMatcher = new AntPathMatcher();

    /**
     * 假设这就是从数据库中查询到的数据
     * 意思就是 ROLE_JAVA 的角色 才能访问 /tt
     */
    private final Map<String, String> urlRoleMap = new HashMap<String, String>() {
   {
   
        put("/tt", "ROLE_JAVA");
    }};

    @Override
    public Collection<ConfigAttribute> getAttributes(Object object) throws IllegalArgumentException {
   
        FilterInvocation fi = (FilterInvocation) object;
        String url = fi.getRequestUrl();
        for (Map.Entry<String, String> entry : urlRoleMap.entrySet()) {
   
            if (antPathMatcher.match(entry.getKey(), url)) {
   
                return SecurityConfig.cre
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值