如何在 Spring Boot 中禁用或覆盖 RequestCacheAwareFilter

Posted

技术标签:

【中文标题】如何在 Spring Boot 中禁用或覆盖 RequestCacheAwareFilter【英文标题】:How to disable or override RequestCacheAwareFilter in Spring Boot 【发布时间】:2016-02-07 16:26:57 【问题描述】:
    我有非常基本的简单 Spring Boot Rest 应用程序。

    我需要在 Spring Security 中实现自定义身份验证:对于每个 REST 请求,我需要检查每个请求的特定标头中的用户名和密码(“用户名”和“密码”)。

    所以我实现了自定义 AuthEntryPoint:

     @Service
    public class CustomAuthEntryPoint implements AuthenticationEntryPoint 
        @Override
        public void commence(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, AuthenticationException e) throws IOException, ServletException 
            String username = httpServletRequest.getHeader("username");
            String password = httpServletRequest.getHeader("password");
            if (!username.equals("admin") || !password.equals("admin")) 
                throw new RuntimeException("", new BadCredentialsException("Wrong password"));
            
        
    

    所以,我意识到,RequestCacheAwareFilter 正在缓存第一个请求,并且标头也存储在缓存中。因此,如果我以错误的方式提出请求,然后以正确的方式提出请求,我仍然会收到异常。

那么,我该如何覆盖或禁用 CacheAwareFilter?还是我做错了什么?

【问题讨论】:

我刚刚将应用设置为无状态,如下所示:***.com/questions/2504590/… 现在一切正常。 【参考方案1】:

使用自定义 WebSecurityConfigurerAdapter 将请求缓存设置为 NullRequestCache:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter 
    @Override
    protected void configure(HttpSecurity http) throws Exception 
        http.requestCache()
            .requestCache(new NullRequestCache());
    

【讨论】:

可以更快地完成(使用 Spring Security 5.2.1):http.requestCache().disable()【参考方案2】:

我只是像这里一样使应用程序无状态:How can I use Spring Security without sessions?

现在一切都好了。

【讨论】:

以上是关于如何在 Spring Boot 中禁用或覆盖 RequestCacheAwareFilter的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Spring Boot 中禁用 Tomcat 的 permessage-deflate WebSocket 压缩?

Spring Boot - 如何通过实现 BeforeAllCallback 的自定义扩展类设置或覆盖 application.yml 中定义的属性?

如何在 spring-boot 中禁用 spring-data-mongodb 自动配置

如何在 Spring-Boot 2 中禁用安全性? [复制]

Spring Boot - 如何在开发过程中禁用@Cacheable?

如何在标准输出中禁用 Spring Boot 徽标?