authenticationentrypoint - Creando mĂșltiples secciones HTTP en Spring Security Java Config
spring security configuration (1)
En Spring Security para imitar el comportamiento de varios elementos <http>
de XML en la configuración de Java, cree varias clases para la configuración de seguridad. En general, es lo mejor / más fácil crear una configuración de seguridad común con varias clases internas para la definición de seguridad para HttpSecurity
. Vea github.com/spring-projects/spring-security/blob/master/config/… para una muestra.
Y aquí la sección relacionada en la documentación oficial de Spring Security:
5.7 HttpSecurity múltiple
Con la configuración XML de Spring Security, puede definir múltiples elementos HTTP para especificar diferentes reglas de acceso para diferentes partes de su aplicación. El ejemplo dado en 8.6 Configuración avanzada de espacio de nombres define secciones separadas con estado y sin estado de la aplicación, con las primeras utilizando sesiones e inicio de sesión de formularios, y la última sin sesiones y autenticación BASIC:
<!-- Stateless RESTful service using Basic authentication -->
<http pattern="/restful/**" create-session="stateless">
<intercept-url pattern=''/**'' access=''ROLE_REMOTE'' />
<http-basic />
</http>
<!-- Empty filter chain for the login page -->
<http pattern="/login.htm*" security="none"/>
<!-- Additional filter chain for normal users, matching all other requests -->
<http>
<intercept-url pattern=''/**'' access=''ROLE_USER'' />
<form-login login-page=''/login.htm'' default-target-url="/home.htm"/>
<logout />
</http>
No puedo imaginar cómo hacer lo mismo con Java Config. Es importante que desactive las sesiones y use un punto de entrada diferente para mis servicios web. Ahora mismo tengo lo siguiente:
@Override
public void configure(WebSecurity security)
{
security.ignoring().antMatchers("/resource/**", "/favicon.ico");
}
@Override
protected void configure(HttpSecurity security) throws Exception
{
security
.authorizeRequests()
.anyRequest().authenticated()
.and().formLogin()
.loginPage("/login").failureUrl("/login?loginFailed")
.defaultSuccessUrl("/ticket/list")
.usernameParameter("username")
.passwordParameter("password")
.permitAll()
.and().logout()
.logoutUrl("/logout").logoutSuccessUrl("/login?loggedOut")
.invalidateHttpSession(true).deleteCookies("JSESSIONID")
.permitAll()
.and().sessionManagement()
.sessionFixation().changeSessionId()
.maximumSessions(1).maxSessionsPreventsLogin(true)
.sessionRegistry(this.sessionRegistryImpl())
.and().and().csrf()
.requireCsrfProtectionMatcher((r) -> {
String m = r.getMethod();
return !r.getServletPath().startsWith("/services/") &&
("POST".equals(m) || "PUT".equals(m) ||
"DELETE".equals(m) || "PATCH".equals(m));
});
}
Usando esto pude deshabilitar la protección CSRF para mis servicios web. Pero realmente necesito una configuración HTTP completamente separada para poder deshabilitar sesiones y especificar un punto de entrada diferente. Sé que puedo usar requestMatcher
o requestMatchers
para restringir los URI a los que se aplica, pero no parece que pueda usar esto para crear configuraciones separadas. Es casi como si necesitara dos métodos de configure(HttpSecurity security)
.