Spring Securityを使用しようとしていますが、別のログインページと別のURLのセットを保護したい場合があります。
これが私の設定です:
@Configuration
@Order(1)
public static class ProviderSecurity extends WebSecurityConfigurerAdapter{
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/", "/home").permitAll()
.antMatchers("/admin/login").permitAll()
.antMatchers("/admin/**").access("hasRole('BASE_USER')")
.and()
.formLogin()
.loginPage("/admin/login").permitAll()
.defaultSuccessUrl("/admin/home")
.failureUrl("/admin/login?error=true").permitAll()
.usernameParameter("username")
.passwordParameter("password")
.and()
.csrf()
.and()
.exceptionHandling().accessDeniedPage("/Access_Denied");
}
}
@Configuration
@Order(2)
public static class ConsumerSecurity extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/consumer/login").permitAll()
.antMatchers("/consumer/**").access("hasRole('BASE_USER')")
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/consumer/login").permitAll()
.defaultSuccessUrl("/consumer/home")
.failureUrl("/consumer/login?error=true").permitAll()
.usernameParameter("username")
.passwordParameter("password")
.and().csrf()
.and()
.exceptionHandling().accessDeniedPage("/Access_Denied");
}
}
これらのクラスは、注釈@EnableWebSecurity
を持つ別のクラスMultipleHttpSecurityConfig
の内部クラスです。
admin/**
のセキュリティは正常に機能していますが、consumer/**
ページは保護されておらず、ログインページのリダイレクトは行われていません。他の回答を検索しましたが、うまくいきませんでした。
Spring Security Reference を見てください。
@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(); } } }
1通常どおり認証を構成する
2
WebSecurityConfigurerAdapter
のインスタンスを作成して@Order
を含め、どのWebSecurityConfigurerAdapter
を最初に考慮するかを指定します。3
http.antMatcher
には、このHttpSecurity
は/api/
で始まるURLにのみ適用されると記載されています4
WebSecurityConfigurerAdapter
の別のインスタンスを作成します。 URLが/api/
で始まらない場合、この構成が使用されます。この構成は、@Order
の後に1
値があるため、ApiWebSecurityConfigurationAdapter
の後に考慮されます(@Order
はデフォルトで持続しません)。
最初の構成は/**
に一致するため(2つの構成は使用されません)(antMatcher
は構成されていません)。また、最初の構成では/admin/**
のみが制限され、他のすべてのURLはデフォルトで許可されています。
最初のWebSecurityConfigurerAdapter
http
.authorizeRequests()
すべてのURLに一致し、antMatcher
を使用して、/admin
で始まるURLのみに制限します。
@Configuration
@Order(1)
public static class ProviderSecurity extends WebSecurityConfigurerAdapter{
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.antMatcher("/admin/**")
.authorizeRequests()
.antMatchers("/admin/login").permitAll()
.antMatchers("/admin/**").access("hasRole('BASE_USER')")
.and()
...