如何仅在 localhost 的 Spring Security 中禁用 csrf?

Posted

技术标签:

【中文标题】如何仅在 localhost 的 Spring Security 中禁用 csrf?【英文标题】:How to disable csrf in spring security for only localhost? 【发布时间】:2018-07-21 18:26:48 【问题描述】:

我有工作的 Spring Boot 应用程序,其中启用了 csrf,但现在我只想为 localhost 禁用它。来自其他域的任何请求都必须通过 csrf 安全性,但对于 localhost,我想禁用它。我怎样才能做到这一点?

我知道如何通过更改来禁用它

@Configuration
@EnableWebMvcSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter 
    @Override
    protected void configure(HttpSecurity http) throws Exception 
        http.csrf.disable();
    

上面的代码禁用了 csrf,但我想为唯一的 localhost 禁用 csrf。

你能帮帮我吗?

编辑:我知道如何通过两个配置文件来做到这一点。感谢@daren 的详细回答。

【问题讨论】:

在 localhost 上禁用它是什么意思? 【参考方案1】:

您可以使用 Spring Profiles 来实现您想要做的事情。

https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-profiles.html

最简单的你可以有两种配置

@Configuration
@EnableWebMvcSecurity
@Profile("!deployed") //Not(!) deployed profile
public class SecurityConfiguration extends WebSecurityConfigurerAdapter 
    @Override
    protected void configure(HttpSecurity http) throws Exception 
        http.csrf.disable();
    

在已部署的区域中,deployed 配置文件处于活动状态。

@Configuration
@EnableWebMvcSecurity
@Profile("deployed")
public class SecurityConfiguration extends WebSecurityConfigurerAdapter 
    @Override
    protected void configure(HttpSecurity http) throws Exception 
        http.csrf.enable();
    

根据您正在执行的安全配置,您可以执行与此相反的操作,并在默认情况下激活一个本地配置文件,这将执行禁用操作。

【讨论】:

我不知道,配置文件是用来处理这种情况的。你可以做其他更棘手的标志,但最终它会基于某种配置文件。 @VishalPatel 另一种解决方案是使用多个 Spring Security 配置。第一个仅用于localhost,带有自定义请求匹配器。【参考方案2】:

您可以使用CsrfConfigurer#requireCsrfProtectionMatcher 方法并使用RequestMatcher 检查请求本地地址和远程地址,例如

private RequestMatcher csrfProtectionMatcher() 
    final Set<String> allowedMethods = ImmutableSet.of("GET", "HEAD", "TRACE", "OPTIONS");
    return request -> !allowedMethods.contains(request.getMethod()) && !(request.getLocalAddr().equals(request.getRemoteAddr()));

【讨论】:

以上是关于如何仅在 localhost 的 Spring Security 中禁用 csrf?的主要内容,如果未能解决你的问题,请参考以下文章

Spring Security仅在成功登录后显示主页[关闭]

Spring CORS 仅在某些资源上失败

如何仅在安全端点上应用 Spring Security 过滤器?

如何仅在 Spring 中为微服务项目的外部客户端启用身份验证?

站点仅在 localhost 中打开

仅在 localhost 上禁用 https