我有一个使用spring security进行身份验证的现有Web应用程序。它还使用会话管理允许用户登录预定义的时间段,并使用XSRF令牌来防止XSS攻击。
@Override
protected void configure(HttpSecurity http) throws Exception {
// @formatter:off
http
.exceptionHandling()
.authenticationEntryPoint(restEntryPoint())
.and()
.headers().addHeaderWriter(new StaticHeadersWriter("Server",""))
.and()
.httpBasic()
.authenticationEntryPoint(restEntryPoint())
.and()
.logout().addLogoutHandler(myLogoutHandler())
.logoutSuccessHandler(logoutSuccessHandler())
.and()
.authorizeRequests()
.antMatchers("/index.html", "/login", "/").permitAll()
.antMatchers(HttpMethod.OPTIONS).denyAll()
.antMatchers(HttpMethod.HEAD).denyAll()
.anyRequest().authenticated()
.and()
.authenticationProvider(myAuthenticationProvider)
.csrf()
.csrfTokenRepository(csrfTokenRepository())
.and()
.addFilterAfter(csrfHeaderFilter(), SessionManagementFilter.class);
// @formatter:on
}
这适用于Web应用程序。但是,现在我被要求添加一个配置,让第三方客户端应用程序通过纯REST调用来调用我的服务,即它们应该是完全无状态的并且使用http基本身份验证 - 不应该创建会话并且应该禁用xsrf(I认为...)。
我可以为所有这些客户端API调用定义共享的URL路径。但是,如何利用现有的安全配置和服务器来支持这两个要求?
答案 0 :(得分:0)
回答我自己的问题......
Spring安全性允许您根据订单使用多个配置。在文档中,它给出了以下示例:
@EnableWebSecurity
public class MultiHttpSecurityConfig {
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) { 1
auth
.inMemoryAuthentication()
.withUser("user").password("password").roles("USER").and()
.withUser("admin").password("password").roles("USER", "ADMIN");
}
@Configuration
@Order(1) 2
public static class ApiWebSecurityConfigurationAdapter extends WebSecurityConfigurerAdapter {
protected void configure(HttpSecurity http) throws Exception {
http
.antMatcher("/api/**") 3
.authorizeRequests()
.anyRequest().hasRole("ADMIN")
.and()
.httpBasic();
}
}
@Configuration 4
public static class FormLoginWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.anyRequest().authenticated()
.and()
.formLogin();
}
}
}
在上面的示例中,/ api仅允许用于ADMIN角色,而其他路径将使用默认的FormLoginWebSecurityConfigurerAdapter进行配置。
在this URL了解详情: