J'essaie d'utiliser Spring Security et j'ai un cas d'utilisation où je veux que différentes pages de connexion et différents ensembles d'URL soient sécurisés.
Voici ma configuration:
@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");
}
}
Ces classes sont des classes internes d'une autre classe MultipleHttpSecurityConfig
qui a une annotation @EnableWebSecurity
.
La sécurité pour admin/**
fonctionne bien, mais aucun des consumer/**
les pages sont sécurisées, aucune redirection n'est en cours pour la page de connexion. J'ai cherché d'autres réponses mais aucune n'a fonctionné.
Regardez le 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 Configurez l'authentification comme d'habitude
2 Créez une instance de
WebSecurityConfigurerAdapter
contenant@Order
pour spécifier quelWebSecurityConfigurerAdapter
doit être considéré en premier.3 Le
http.antMatcher
indique que cetteHttpSecurity
ne sera applicable qu'aux URL commençant par/api/
4 Créez une autre instance de
WebSecurityConfigurerAdapter
. Si l'URL ne commence pas par/api/
cette configuration sera utilisée. Cette configuration est considérée aprèsApiWebSecurityConfigurationAdapter
car elle a un@Order
valeur après1
(non@Order
par défaut pour durer).
Votre deuxième configuration n'est pas utilisée, car votre première configuration correspond à /**
(pas de antMatcher
configuré). Et votre première configuration ne limite que /admin/**
, toutes les autres URL sont autorisées par défaut.
Vos premiers WebSecurityConfigurerAdapter
http
.authorizeRequests()
correspond à toutes les URL, limitez-la aux seules URL commençant par /admin
en utilisant 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()
...