我开发了一个带弹簧靴的应用程序,工作正常。有一个安静的控制器。我试图在某些页面添加spring security。 其余控制器的端点是
/api/greetings
我在下面的课程中配置了安全设置。
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/", "/home","/api/greetings").permitAll()
//.antMatchers("/api/greetings","").permitAll()//can't do this
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")
.permitAll()
.and()
.logout()
.permitAll();
}
现在,当我尝试从Rest-client(Postman)访问Rest端点时,只能访问GET方法,如果我尝试POST,PUT或DELETE,我将收到403 Forbidden响应。
{
"timestamp": 1467223888525,
"status": 403,
"error": "Forbidden",
"message": "Invalid CSRF Token 'null' was found on the request parameter '_csrf' or header 'X-CSRF-TOKEN'.",
"path": "/api/greetings/2"
}
我该如何解决这个问题。我是Spring Security的新手。
答案 0 :(得分:5)
更新答案
如果您正在使用Spring security 4,则可以轻松禁用特定路由
http.csrf().ignoringAntMatchers("/nocsrf","/ignore/startswith/**")
如果没有,您可以使用requireCsrfProtectionMatcher
http.csrf().requireCsrfProtectionMatcher(new RequestMatcher() {
private Pattern allowedMethods = Pattern.compile("^(GET|HEAD|TRACE|OPTIONS)$");
private RegexRequestMatcher apiMatcher = new RegexRequestMatcher("/v[0-9]*/.*", null);
@Override
public boolean matches(HttpServletRequest request) {
// No CSRF due to allowedMethod
if(allowedMethods.matcher(request.getMethod()).matches())
return false;
// No CSRF due to api call
if(apiMatcher.matches(request))
return false;
// CSRF for everything else that is not an API call or an allowedMethod
return true;
}
});
原始回答
您收到错误,因为CSRF处理的问题是'默认情况下使用Spring Security。
您可以通过添加http.csrf().disable();
来停用它。
但实际上,您是否会将应用程序置于无担保状态?我邀请您阅读this article以保护您的应用程序免受CSRF攻击,即使您的应用程序基于REST服务而非表单提交。