SpringSecurity如何设置白名单策略

 更新时间:2024年07月24日 10:05:32   作者:VermouthSp  
这篇文章主要介绍了SpringSecurity如何设置白名单策略,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧

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

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

Security白名单策略

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

 @Bean
    public WebSecurityCustomizer ignoringCustomizer() {
        return web -> web.ignoring().requestMatchers(whiteUrlArr);
    }

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

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

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

    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真正的白名单,而不仅仅是对相应路径进行免权访问.

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

到此这篇关于SpringSecurity如何正确的设置白名单的文章就介绍到这了,更多相关SpringSecurity白名单内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java使用EasyExcel实现合并单元格

    java使用EasyExcel实现合并单元格

    这篇文章主要为大家详细介绍了java使用EasyExcel实现合并单元格的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-12-12
  • SpringBoot 如何整合 ES 实现 CRUD 操作

    SpringBoot 如何整合 ES 实现 CRUD 操作

    这篇文章主要介绍了SpringBoot 如何整合 ES 实现 CRUD 操作,帮助大家更好的理解和使用springboot框架,感兴趣的朋友可以了解下
    2020-10-10
  • springboot:接收date类型的参数方式

    springboot:接收date类型的参数方式

    这篇文章主要介绍了springboot:接收date类型的参数方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • Netty实现简易版的RPC框架过程详解

    Netty实现简易版的RPC框架过程详解

    这篇文章主要为大家介绍了Netty实现简易版的RPC框架过程详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • Java方法上注解值修改不成功的问题

    Java方法上注解值修改不成功的问题

    这篇文章主要介绍了Java方法上注解值修改不成功的解决方法,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-02-02
  • java向文件末尾添加内容示例分享

    java向文件末尾添加内容示例分享

    本文为大家提供一个java向文件末尾添加内容的示例分享,大家参考使用吧
    2014-01-01
  • JDK13.0.1安装与环境变量的配置教程图文详解(Win10平台为例)

    JDK13.0.1安装与环境变量的配置教程图文详解(Win10平台为例)

    这篇文章主要介绍了JDK13.0.1安装与环境变量的配置教程图文详解(Win10平台为例),本文图文并茂给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-01-01
  • Spring Cloud Feign统一设置验证token实现方法解析

    Spring Cloud Feign统一设置验证token实现方法解析

    这篇文章主要介绍了Spring Cloud Feign统一设置验证token实现方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • SpringBoot中集成Swagger2及简单实用

    SpringBoot中集成Swagger2及简单实用

    使用Swagger你只需要按照它的规范去定义接口及接口相关的信息,再通过Swagger衍生出来的一系列项目和工具,就可以做到生成各种格式的接口文档,以及在线接口调试页面等等,这篇文章主要介绍了SpringBoot中集成Swagger2,需要的朋友可以参考下
    2023-06-06
  • java中的Timer和Timertask的关系解读

    java中的Timer和Timertask的关系解读

    本文详细介绍了Java中的Timer和TimerTask类,包括它们之间的关系、API的使用方法、注意事项以及操作案例,Timer是一个调度器,而TimerTask是具体的任务类,Timer仅对应一个线程,不保证任务执行的精确性,但线程安全,一个Timer可以调度多个TimerTask
    2024-12-12

最新评论