Sto cercando di utilizzare Spring Security e ho un caso d’uso in cui voglio che vengano salvate diverse pagine di accesso e diversi set di URL.
Ecco la mia configurazione:
@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"); } }
Queste classi sono classi interne di un’altra class MultipleHttpSecurityConfig
con annotazione @EnableWebSecurity
.
La sicurezza per admin/**
funziona correttamente, ma nessuna delle pagine consumer/**
è protetta, nessun reindirizzamento è in corso per la pagina di accesso. Ho cercato altre risposte ma nessuna ha funzionato.
Guarda il riferimento sulla sicurezza di 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(); } } }
1 Configura l’autenticazione come di consueto
2 Creare un’istanza di
WebSecurityConfigurerAdapter
che contenga@Order
per specificare qualeWebSecurityConfigurerAdapter
deve essere considerato per primo.3
http.antMatcher
afferma che questaHttpSecurity
sarà applicabile solo agli URL che iniziano con/api/
4 Creare un’altra istanza di
WebSecurityConfigurerAdapter
. Se l’URL non inizia con/api/
verrà utilizzata questa configurazione. Questa configurazione viene considerata dopoApiWebSecurityConfigurationAdapter
poiché ha un valore@Order
dopo1
(nessun@Order
predefinito di@Order
).
La tua seconda configurazione non viene utilizzata, perché la tua prima configurazione corrisponde a /**
. E la tua prima configurazione limita solo /admin/**
, tutti gli altri URL sono consentiti per impostazione predefinita.
Il tuo primo WebSecurityConfigurerAdapter
http .authorizeRequests()
corrisponde a tutti gli URL, limita solo agli URL che iniziano con /admin
usando antMatcher
:
@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() ...