如何仅在 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 Security 过滤器?