如何在 Spring Boot 2 中处理 security.enable-csrf?
Posted
技术标签:
【中文标题】如何在 Spring Boot 2 中处理 security.enable-csrf?【英文标题】:How to handle security.enable-csrf in Spring Boot 2? 【发布时间】:2019-03-01 01:51:20 【问题描述】:我正在将应用程序从 Spring Boot 1.5 迁移到 2.0.5。
我在 1.5 版本中有一个属性设置为 security.enable-csrf=true
,这在 Spring Boot 2.0 版本中不可用。
我阅读了文档,据说在 Spring Boot 2.0 中:
在 Java 配置中默认启用 CSRF 保护。
所以默认情况下它是启用的,但是还创建了一个扩展 WebSecurityConfigurerAdapter
的类,这意味着 Spring Boot 默认安全配置已关闭。这是否也意味着security.enable-csrf
现在被禁用了?
如果是,我该如何启用它,就像我在 1.5 版本的应用程序中一样。
我没有得到任何文件明确确认如何在 Spring Boot 2.0 中处理 security.enable-csrf
属性以及声明 WebSecurityConfigurerAdapter
。
有人知道吗?此外,我错过的任何文档链接都会有很大帮助。
【问题讨论】:
如果你只扩展WebSecurityConfigurerAdapter
而不禁用默认值,它仍然是打开的。只有在没有找到其他 WebSecurityConfigurerAdapter
时,WebSecurityConfigurerAdapter
的 Spring Boot 可用扩展才会启动。 Spring Boot 默认类只使用 Spring Security 默认值(它是一个空实现)。
【参考方案1】:
WebSecurityConfigurerAdapter
是一个抽象类,当你创建一个扩展WebSecurityConfigurerAdapter
的类时,你会覆盖void configure(HttpSecurity http)
方法。
你可以在这个方法中禁用csrf,就像那样;
http.csrf().disable();
您可以在csrf()
方法(在HttpSecurity
类中)之上阅读此评论。
添加 CSRF 支持。使用时默认激活
WebSecurityConfigurerAdapter
的默认构造函数。你可以禁用它....”
这条评论说,当你扩展这个类时,WebSecurityConfigurerAdapter
的默认构造函数工作并且 csrf 被激活。
【讨论】:
【参考方案2】:为了向后兼容您应用程序中已设置的属性security.enable-csrf=true
,您可以使用以下代码:
@EnableWebSecurity
public class WebSecurityConfig extends
WebSecurityConfigurerAdapter
@Value("$security.enable-csrf")
private boolean csrfEnabled;
@Override
protected void configure(HttpSecurity http) throws Exception
if (!csrfEnabled)
http.csrf().disable();
正如您可能猜到的那样,魔法来自
http.csrf().disable();
在上面的代码中,您可以控制启用/禁用它 您在 application.properties 文件中设置的属性。
更多信息:
更多细节也可以参考spring文档:
https://docs.spring.io/spring-security/site/docs/current/reference/htmlsingle/#csrf【讨论】:
以上是关于如何在 Spring Boot 2 中处理 security.enable-csrf?的主要内容,如果未能解决你的问题,请参考以下文章
sec:authorize 不起作用 - Spring Boot 2、Thymeleaf 3、Thymeleaf Spring Security 5 集成包
将 Spring Boot 1.5 升级到 2 <sec:authorize> 不起作用
thymeleaf sec:授权在 Spring Boot 中不工作
为传递依赖项禁用 Spring Boot AutoConfiguration