我有一个REST服务,使用Java,Spring-boot和Spring Security with Basic Access Authentication构建。没有视图,没有JSP等,没有“登录”,只有无状态服务可以从单独托管的React应用程序中调用。
我已经阅读了有关CSRF保护的各种文档,但无法决定是否应该使用spring-security CSRF配置,或者只是禁用它?如果我禁用csrf保护,我可以使用我的基本身份验证调用curl服务,如下所示:
curl -H "authorization:Basic c35sdfsdfjpzYzB0dDFzaHA=" -H "content-type:application/json" -d '{"username":"user","password":"password","roles":"USER"}' localhost:8081/api/v1/user
如果我启用了csrf保护并提供了x-csrf-token
标头,那么spring CsrfFilter会尝试与HttpServletRequest
中的会话cookie中的值(我认为)交叉检查。但是,由于它是无状态的REST服务,我没有会话,并且没有“登录”。
我有一个如下所示的配置类:
@EnableWebSecurity
@Configuration
public class ServiceSecurityConfigurationAdapter extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.anyRequest().fullyAuthenticated()
.and().httpBasic();
if (!serviceProperties.isCsrfEnabled()) {
http.csrf().disable();
}
}
我想的越多,我就越需要禁用CSRF保护。有没有其他方法来配置弹簧安全性,以便它可以工作?
感谢
答案 0 :(得分:2)
要回答您的第一个问题,在您描述的上下文中,您不需要CSRF保护。 CSRF保护的背景是确保用户不会被欺骗做一些不需要的操作。
例如,在纯理论中,您可以登录银行的网站(从而建立会话)然后去一些阴暗的网站。该站点可以有一个表单向银行的API发出POST请求。因为那里有会话,如果端点不受CSRF保护,则请求可以通过。
因此,CSRF主要用于防止基于浏览器+会话的攻击。如果您公开纯REST API,例如OAuth保护,然后我没有看到CSRF的任何原因。
使用spring boot时,您还可以使用application.properties
/ application.yaml
配置文件禁用CSRF。
security.enable-csrf=false
您可以查看Common Application Properties文档页面,了解更多开箱即用的配置选项。
答案 1 :(得分:0)
如果要以更合适的方式禁用csrf,可以像这样调用它(如果使用java配置)
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.anyRequest().fullyAuthenticated()
.and().httpBasic();
.and()
.csrf()
.disable()