Spring Boot网络应用程序w / both session + CSRF&没有CSRF的无状态基本身份验证

时间:2015-06-30 18:16:16

标签: spring-security spring-boot csrf basic-authentication

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

有谁知道如何配置?我已经看过很多使用其中一个的例子,但不是两个都在一起。

1 个答案:

答案 0 :(得分:0)

所以我终于回过头来再次研究这个问题,事实证明解决方案几乎和我预期的一样简单。解决方案是有两个WebSecurityConfigurerAdapter类。这在这里描述:

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

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

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

    @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();
        }
    }