5.9. 多重 HttpSecurity
我們可以設定多個 HttpSecurity
實例,如同在命名空間用多個 <http>
作設定一樣。關鍵是要在多處繼承 WebSecurityConfigurationAdapter
。
以下範例示範如何對 /api/
開頭的 URL 作不同的設定:
@EnableWebSecurity
public class MultiHttpSecurityConfig {
@Bean // 1.
public UserDetailsService userDetailsService() throws Exception {
// 確保密碼有良好的編碼
UserBuilder users = User.withDefaultPasswordEncoder();
InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();
manager.createUser(users.username("user").password("password").roles("USER").build());
manager.createUser(users.username("admin").password("password").roles("USER","ADMIN").build());
return manager;
}
@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();
}
}
}
- 一般驗證機制設定
- 建立一個包含
@Order
註解的WebSecurityConfigurerAdapter
實例,以指明哪一個WebSecurityConfigurerAdapter
要先被考慮 http.antMatcher
描述了這個HttpSecurity
只會適用於開頭為/api/
的 URL- 建立另一個
WebSecurityConfigurerAdapter
實例,如果 URL 開頭不是/api/
則此設定會被使用。因為此設定的@Order
值在 1 之後 (沒有@Order
則預設為最後),所以此設定會在ApiWebSecurityConfigurationAdapter
之後才會被考慮