我有一个具有spring-cloud-security的项目。这是用于oauth授权的身份验证服务器。过去效果很好。
我添加了用于配置SSL的spring配置文件
security:
require-ssl: true
server:
ssl:
key-store: dev.p12
key-store-password: devpass
keyStoreType: PKCS12
keyAlias: calc
使用此配置文件,身份验证可以正常工作,但是当我禁用它并通过http登录时,身份验证将失败。
o.s.security.web.csrf.CsrfFilter : Invalid CSRF token found for http://localhost:8090/login
我该如何解决?
答案 0 :(得分:0)
您的服务器已启用CSRF。 @EnableWebSecurity
注释将默认启用documentation中所述的CSRF。
默认情况下,使用Java配置启用CSRF保护。
有两种方法可以“解决”此问题,即在执行PATCH
,POST
,PUT
和DELETE
动作时禁用CSRF或submit the CSRF-token。
要禁用CSRF,请在Spring Security配置中执行
@EnableWebSecurity
@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable();
}
}
要提交CSRF令牌,必须将其包含在对服务器的请求中(在本示例中为JSP,它发送了POST
请求)
<c:url var="logoutUrl" value="/logout"/>
<form action="${logoutUrl}" method="post">
<input type="submit" value="Log out" />
<input type="hidden" name="${_csrf.parameterName}"
value="${_csrf.token}"/>
</form>
所有示例摘自Spring Cross Site Request Forgery (CSRF) documentation
在考虑是否禁用CSRF时,请考虑Spring的建议
[...]将CSRF保护用于可能由服务器处理的任何请求 普通用户使用的浏览器。如果您仅创建的服务是 由非浏览器客户端使用,您可能需要禁用CSRF 保护。