SpringSecurity如何正确的设置白名单

在SpringSecurity中,往往需要对部分接口白名单访问,而大部分在使用Security中就有一个误区,那就是免鉴权访问和白名单的区别。

大部分的Security文章包括官方文档给出免鉴权访问都是使用**.permitAll()**去对相应路径进行免鉴权访问,但实际上这仅仅只表示该资源不需要相应的权限访问,但是用户还需要认证.也就是Security的认证/授权两个概念.

Security白名单策略

将需要放行的白名单使用.ignoring注册.

java 复制代码
 @Bean
    public WebSecurityCustomizer ignoringCustomizer() {
        return web -> web.ignoring().requestMatchers(whiteUrlArr);
    }

当Spring启动后,会将其中每个url注册为一个MvcRequestMatcher并且放入到WebSecurity中的ignoredRequests管理。

然后在构建WebSecurity时去创建对应的DefaultSecurityFilterChain.

然后这些会被放入到Security的过滤链中交给WebSecurity进行管理,当有请求进入后就会进入到过滤链时,WebSecurity会去循环调用chian,以获取处理请求路径对应的过滤器组成过滤链,如果未注册ignor则会使用默认的AnyRequest,这将返回全部的Security过滤器.

java 复制代码
    private List<Filter> getFilters(HttpServletRequest request) {
        int count = 0;
        Iterator var3 = this.filterChains.iterator();

        SecurityFilterChain chain;
        do {
            if (!var3.hasNext()) {
                return null;
            }

            chain = (SecurityFilterChain)var3.next();
            if (logger.isTraceEnabled()) {
                ++count;
                logger.trace(LogMessage.format("Trying to match request against %s (%d/%d)", chain, count, this.filterChains.size()));
            }
        } while(!chain.matches(request));

        return chain.getFilters();
    }

而DefaultSecurityChain则会使用其对应的match对请求路径进行匹配,如果匹配上则返回相应的过滤器.

匹配成功返回RequestMatchResult:

通过返回的对象是否为空进行判断是否匹配成功:

匹配成功后会返回其对应的Filter,因为是通过igonr去进行忽略的所以filter为空,所以就会忽略对对应路径请求的鉴权等操作.

这就是SpringSecurity真正的白名单,而不仅仅是对相应路径进行免权访问.

后续会尝试去探索免权访问...

相关推荐
深盾科技_Virbox9 小时前
加密狗授权能力选型:从授权模型到全生命周期管理
java·网络·数据库
. . . . .9 小时前
Egg框架深入
java·开发语言
RainCity9 小时前
Java Swing 自定义组件库分享(十三)
java·笔记·后端
livemetee10 小时前
【关于Spring声明式事务】
java·后端·spring
倒流时光三十年10 小时前
Java 内存模型(JMM)通俗解释
java·开发语言
码兄科技11 小时前
Java AI智能体开发实战:从零构建企业级智能应用指南
java·开发语言·人工智能
2401_8595062411 小时前
AIGC赋能大漆摆件设计:从痛点分析到技术架构与实战验证
java·大数据·人工智能
剑挑星河月11 小时前
54.螺旋矩阵
java·算法·leetcode·矩阵
Lhappy嘻嘻11 小时前
Java 并发编程(六)|并发进阶高频:CAS、锁升级
java·开发语言
要开心吖ZSH12 小时前
MVCC 进阶:快照读 vs 当前读、幻读与 Next-Key Lock
java·数据库·sql·mysql·mvcc