首页 > 其他分享 >spring security 6:放行某些请求-接口

spring security 6:放行某些请求-接口

时间:2024-04-10 11:26:02浏览次数:14  
标签:ben spring 博客园 system SecurityFilterChain Bean 放行 security

spring boot 3.1.10

spring-boot-starter-security 3.1.10

spring security web 6.1.8

--

ben发布于博客园

序章

自定义了 Bean SecurityFilterChain,在 http.authorizeHttpRequests 中放行了 接口“/system/register”,还定义了 session管理 的 invalidSessionStrategy。

@Bean

public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {

.authorizeHttpRequests((authorize) -> authorize .requestMatchers("/system/register").permitAll() .anyRequest().authenticated() ) .sessionManagement(sm -> sm .invalidSessionStrategy(new AppInvalidSessionStrategy()) )

)

return http.build();

}

可是,遇到了问题:访问 /system/register 时,提示 “无效凭证”——由 invalidSessionStrategy 触发。

无效凭证的原因 是 请求自带了 Cookie JSESSIONID,触发了 SESSION 验证机制,验证无效,由 自定义的  invalidSessionStrategy 处理——返回错误信息。

期望:接口 /system/register 无需验证、授权即可访问。

 

解决方案1:添加Bean WebSecurityCustomizer

根据 参考资料#1 的介绍,添加了一个 Bean WebSecurityCustomizer,解决了问题。

@Bean
public WebSecurityCustomizer ignoringCustomizer() {
    // 忽略注册接口
    return (web) -> web.ignoring()
        .requestMatchers("/system/register");
}

更多介绍,请查看 参考资料#1。

ben发布于博客园

解决方案2:添加 空Filter列表 的 Bean SecurityFilterChain(推荐)

根据 官网文档:

Spring Security > Servlet Applications > Architecture(https://docs.spring.io/spring-security/reference/servlet/architecture.html) 的介绍,

可以 添加多个 SecurityFilterChain 实例(multiple SecurityFilterChain instances),各个实例 处理 不同的请求。

官方图官方图-multi-securityfilterchain.png

在官文 中有这样一句话:

It is important to note that each SecurityFilterChain can be unique and can be configured in isolation.

In fact, a SecurityFilterChain might have zero security Filter instances if the application wants Spring Security to ignore certain requests.

翻译(金山词霸):

需要注意的是,每个安全过滤器链都可以是 唯一的,并且可以 进行 隔离配置。

实际上,如果应用程序 希望Spring安全程序 忽略 某些请求,那么 安全过滤器链 可能 没有任何安全过滤器实例。

这不正是自己想要的吗——忽略某些请求(/system/register)?

鼓捣了好一会儿,最终,直接 添加一个 空Filter列表 的 Bean SecurityFilterChain 从而实现了需求。

@Bean
public SecurityFilterChain securityFilterChainEmpty() {

    return new SecurityFilterChain() {
        private RequestMatcher requestMatcher = request -> request
            .getRequestURI().startsWith("/system/register");
        @Override
        public boolean matches(HttpServletRequest request) {
            return requestMatcher.matches(request);
        }

        @Override
        public List<Filter> getFilters() {
            return new ArrayList<>();
        }
    };
}

ben发布于博客园

小结

推荐使用 解决方案#2。

没事多看看 官方文档。

 

---END---

ben发布于博客园

本文链接:

https://www.cnblogs.com/luo630/p/18125429

ben发布于博客园

参考资料

1、SpringSecurity6解决requestMatchers().permitAll()后依然执行自定义过滤器的问题

吃青椒的秋草鹦鹉
已于 2023-06-04 22:02:31 修改
https://blog.csdn.net/m0_54250110/article/details/131037578

2、

 

ben发布于博客园

ben发布于博客园

 

标签:ben,spring,博客园,system,SecurityFilterChain,Bean,放行,security
From: https://www.cnblogs.com/luo630/p/18125429

相关文章

  • 从零开始学Spring Boot系列-外部化配置
    SpringBoot允许你将配置外部化,以便可以在不同的环境中使用相同的应用程序代码。可以使用属性文件、YAML文件、环境变量和命令行参数将配置外部化。属性值可以通过使用@Value注解直接注入bean,可以通过Spring的Environment抽象访问,也可以通过@ConfigurationProperties。S......
  • Spring Boot集成JavaMailSender发送邮件,支持二进制流
    什么是JavaMailSenderJavaMailSender是SpringFramework中的一个接口,用于发送电子邮件。它是Spring对JavaMailAPI的封装,提供了更简单和更方便的方式来发送邮件。JavaMailSender接口定义了一组发送邮件的方法,包括发送简单文本邮件、发送带附件的邮件、发送HTML格式的邮件等。它隐......
  • 基于Springboot+Vue的Java项目-月度员工绩效考核管理系统(附演示视频+源码+LW)
    大家好!我是程序员一帆,感谢您阅读本文,欢迎一键三连哦。......
  • Java面试题-13Spring
    1、事务管理spring事务分为编程式事务和声明式事务Spring事务管理器的行为的重要组成部分。下面是对这些属性的简要解释:1.**value**:用于指定事务管理器的名称。如果应用中只有一个事务管理器,通常可以省略该属性。2.**propagation**:指定事务的传播机制,即在多个事务方法相互调......
  • 【Spring】-Spring之线程池
    目录Spring中的线程池Spring中的线程池在spring中其实也是有线程池的,一般使用的是ThreadPoolTaskExecutor该类,其实现方法还是java.util.concurrent中的ThreadPoolExecutor线程为了提高自定义化,一般都是自定义配置核心线程数,最大线程数,队列,以及拒绝策略,下面是代码演示,@......
  • 【Spring】-Spring 之AOP注解
    目录Spring之AOP注解AOP思想:AOP的使用场景:@Aspect的使用以及基本概念:1.切面类2.切点@Pointcut3.Advice,4.JoinPoint:5.使用&&、||、!、三种运算符来组合切点表达式,表示与或非的关系;6.@annotation(annotationType)匹配指定注解为切入点的方法;具体代码实现:Spring之AOP注解A......
  • 基于java+springboot+vue实现的农产品智慧物流系统(文末源码+Lw)23-239
    摘 要互联网发展至今,无论是其理论还是技术都已经成熟,而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播,搭配信息管理工具可以很好地为人们提供服务。针对信息管理混乱,出错率高,信息安全性差,劳动强度大,费时费力等问题,采用农产品智慧物流系统可以有效管理,使信息管......
  • 基于java+springboot+vue实现的人事管理系统(文末源码+Lw)23-242
    摘 要使用旧方法对人事管理系统的信息进行系统化管理已经不再让人们信赖了,把现在的网络信息技术运用在人事管理系统的管理上面可以解决许多信息管理上面的难题,比如处理数据时间很长,数据存在错误不能及时纠正等问题。这次开发的人事管理系统对字典管理、公告管理、绩效管理、......
  • 【SpringBoot + Tomcat】【二】请求到达后端服务进程后的处理过程-连接的处理细节
    1 前言上节的后半部分,由于忙项目的事情去了,收尾的有点潦草,我们这节再继续。上节我们的思路是先简单回顾了下,SpringBoot启动和创建Tomcat的时机,然后我们还主要看了下连接器Connector的创建已经启动过程。连接器本身很重要,因为它就像一个港口或者一个枢纽,连接着客户端和服......
  • 详解Java Chassis 3与Spring Cloud的互操作
    本文分享自华为云社区《JavaChassis3技术解密:与SpringCloud的互操作》,作者:liubao68。JavaChassis3一个很重要的设计原则:利用架构的韧性设计来解决兼容性问题。比如通过引入微服务网关,来解决不同语言、不同框架、遗留系统之间的互操作问题。本文在这个架构原则基础上,讨论......