Spring 使用会话+CSRF 和无状态基本身份验证启动 Web 应用程序 w/oCSRF

Spring Boot web app w/ both session + CSRF & stateless Basic Auth w/o CSRF

我正在尝试建立一个 Spring 基于引导的 Web 服务器,它支持基于安全会话的 UI,包括 CSRF 保护和通过基本身份验证进行身份验证的无状态访问不需要CSRF。我试图支持的两个用例是一个标准 AngularJS UI 和一个简单的 REST api,它对每个请求进行身份验证。

有人知道怎么配置吗?我见过很多使用其中一种的例子,但没有同时使用这两种方法。

所以我终于重新开始研究这个问题,结果发现解决方案几乎和我预期的一样简单。解决办法是有两个WebSecurityConfigurerAdapter类。此处对此进行了描述:

http://docs.spring.io/spring-security/site/docs/3.2.x/reference/htmlsingle/#multiple-httpsecurity

执行此操作时需要注意的两件事是:

  1. WebSecurityConfigurerAdapter 类 必须有不同的 @Order 值。所以我用 @Order(1) 注释其中一个,强制在处理 HTTP 请求时首先评估那个。在我的例子中,哪个是第一个并不重要,它们只需要不同即可。
  2. 两个HttpSecurity配置需要应用于不同的URL。这是通过为每个值使用 antMatcher() 值来完成的。鉴于提供给 @RequestMapping 的值可以是一个 URL 数组,仍然可以只使用一个 REST 控制器方法来处理对两个 URL 的请求。

他们在这里:

@Configuration
@EnableWebSecurity
@Order(1)
public class APISecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    @Order(1)
    protected void configure(HttpSecurity http) throws Exception {

        http.antMatcher("/api/**")
                .authorizeRequests()
                .anyRequest().fullyAuthenticated().and()
                .httpBasic().and()
                .csrf().disable();
    }
}

@Configuration
@EnableWebSecurity
public class UISecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {

        http.authorizeRequests()
                .antMatchers("/ui/**").authenticated();
    }
}