我试图建立一个基于Spring Boot的Web服务器,它支持基于安全会话的UI,包括CSRF保护和通过基本身份验证进行身份验证且不需要CSRF的无状态访问。我试图支持的两个用例是标准的AngularJS UI和一个简单的REST api,可以在每个请求中进行身份验证。
有谁知道如何配置?我已经看过很多使用其中一个的例子,但不是两个都在一起。
答案 0 :(得分:0)
所以我终于回过头来再次研究这个问题,事实证明解决方案几乎和我预期的一样简单。解决方案是有两个WebSecurityConfigurerAdapter
类。这在这里描述:
http://docs.spring.io/spring-security/site/docs/3.2.x/reference/htmlsingle/#multiple-httpsecurity
执行此操作时需要注意两件事:
WebSecurityConfigurerAdapter
类必须具有不同的@Order
值。所以我用@Order(1)
注释其中一个,强制在处理HTTP请求时首先评估一个。在我的情况下,首先是哪一个并不重要,它们必须是不同的。HttpSecurity
配置需要应用于不同的网址。这是通过为每个值使用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();
}
}