2016-12-02 73 views
2

试图在最新的Spring Boot上实现CSRF保护。 互联网上的所有例子都基于用户登录和身份验证,我不需要这些。Spring Boot CSRF

我的网站没有任何要求验证的部分。 我想

1) Rest requests come from within site. No direct request from outside with wget to be allowed.

2) All pages (routes) must be requested from the index page (/)

包括在pom.xml

<dependency> 
<groupId>org.springframework.boot</groupId> 
<artifactId>spring-boot-starter-security</artifactId> 
</dependency> 

的安全性依赖 - 定义用户application.properties(虽然,我并不需要)

- 应用程序创建_csrf.token

- 创建的类扩展WebSecurityConfigurerAdapter与“配置”方法覆盖。

在“配置”中尝试了所有建议的过滤器。它没有工作,最后留下空白。

问题是Wget可以直接获取api页面。 如何防止它?

+0

我敢肯定你不能这样做,你在说什么这里没有一些身份验证,所以你就必须有隐含的授权。我假设您已阅读此http://docs.spring.io/spring-security/site/docs/current/reference/html/csrf.html以确保事情是正确的。在一个应用程序中,我们必须专门禁用非浏览器项目的CSRF,以便它能正常工作。请发布您认为应该工作的最佳配置和类。 GitHub的例子可能是最简单的。 –

回答

1

我赶紧把这个一起配置的POC:

@Configuration 
@EnableWebSecurity 
@SpringBootApplication 
public class StackoverflowQ40929943Application extends WebSecurityConfigurerAdapter{ 

    public static void main(String[] args) { 
     SpringApplication.run(StackoverflowQ40929943Application.class, args); 
    } 

    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     http 
       .authorizeRequests() 
        .antMatchers("/**").permitAll(); 
    } 

} 

它的要点是春天引导+安全会自动保护所有的端点。在这里,我们明确允许所有端点的请求。但是,Spring Boot + Security会自动配置我们启用的CSRF。因此,你可以得到两全其美的好处。

注:您可能需要进一步优化此配置以满足您的需求。

Full Example on GitHub

+0

Tks。测试年代码。当POST请求直接发送到/端点时,它工作。 正确的,当_csrf字段不包含在POST请求中时,出现错误:(status = 403)。 在请求参数'_csrf'或头部'X-CSRF-TOKEN'上找到无效的CSRF令牌'4afa89cc'。< 但是/端点控制器对没有控制权的GET请求做出响应。 即使我在请求中添加了错误的“X-CSRF-TOKEN”或“_csrf”标头。 应用程序应直接响应以上错误的GET请求,而不是从应用程序内部传入。 可能在GET URL中添加_csrf或者使用过滤器WebSecurityConfigurerAdapter。 – user3687431

+0

由于GET请求被假定为只读,因此无害,因此GET请求不包含在默认的CSRF保护中。正如您所建议的,您可以使用自定义配置添加它。 –