authenticationentrypoint java spring security spring-mvc spring-security

java - authenticationentrypoint - spring security 5 xml configuration



Spring Security: la configuración HTTP múltiple no funciona (2)

Mira la referencia de seguridad de 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 Configure la autenticación como normal

2 Cree una instancia de WebSecurityConfigurerAdapter que contenga @Order para especificar qué WebSecurityConfigurerAdapter debe considerarse primero.

3 El http.antMatcher establece que este HttpSecurity solo será aplicable a las URL que comienzan con /api/

4 Cree otra instancia de WebSecurityConfigurerAdapter . Si la URL no comienza con /api/ , se usará esta configuración. Esta configuración se considera después de ApiWebSecurityConfigurationAdapter ya que tiene un valor de @Order después de 1 (ningún @Order predeterminado de @Order es el último).

Su segunda configuración no se utiliza, porque su primera configuración coincide con /** (sin antMatcher configurado). Y su primera configuración solo restringe /admin/** , todas las demás URL están permitidas de manera predeterminada.

Estoy tratando de usar Spring Security y tengo un caso de uso en el que quiero que se aseguren diferentes páginas de inicio de sesión y diferentes conjuntos de URL.

Aquí está mi configuración:

@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"); } }

Estas clases son clases internas de otra clase MultipleHttpSecurityConfig que tiene la anotación @EnableWebSecurity .

La seguridad para admin/** está funcionando bien, pero ninguna de las páginas de consumer/** está protegida, no se está realizando una redirección para la página de inicio de sesión. He buscado otras respuestas pero ninguna funcionó.


Su primer WebSecurityConfigurerAdapter ''s

http .authorizeRequests()

coincide con todas las URL, limítelo a solo las URL que comiencen 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() ...