Solución:
No puede configurar un controlador de éxito de autenticación para la autenticación BÁSICA. Sin embargo, puede extender BasicAuthenticationFilter y anular el método onSuccessfulAuthentication:
@Component("customBasicAuthFilter")
public class CustomBasicAuthFilter extends BasicAuthenticationFilter {
@Autowired
public CustomBasicAuthFilter(AuthenticationManager authenticationManager) {
super(authenticationManager);
}
protected void onSuccessfulAuthentication(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, Authentication authResult) {
// Do what you want here
}
}
Inyectelo en su configuración de seguridad con algo como:
<http entry-point-ref="basicEntryPoint">
<custom-filter ref="customBasicAuthFilter" position="BASIC_AUTH_FILTER"/>
</http>
<authentication-manager alias="authenticationManager">
...
</authentication-manager>
Actualizar: O con la configuración de Java en lugar de XML:
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.addFilterAt(customBasicAuthFilter, BasicAuthenticationFilter.class)
.exceptionHandling().authenticationEntryPoint(basicEntryPoint);
}
Como solución alternativa, puede utilizar http-básico en conjunción con formulario de inicio de sesión:
<http auto-config="true">
...
<http-basic />
<form-login authentication-success-handler-ref="authenticationSuccessHandler" ... />
...
</http>
BasicAuthenticationFilter funcionará.
EDITAR.
Si desea configurar su versión anulada de BasicAuthenticationFilter, creo que necesita:
- Agréguelo a la cadena de filtros en la posición BASIC_AUTH_FILTER como se explica aquí
- Configure el punto de entrada BasicAuthenticationEntryPoint correspondiente a través de entrada-punto-ref atributo de http etiqueta.
En lugar de usar un AuthenticationSuccessHandler
puede confiar en el mecanismo de eventos de Spring Security y escuchar AuthenticationSuccessEvent
mediante el uso de la interfaz ApplicationListener:
@Component
public class AuthenticationEventListener implements
ApplicationListener<AuthenticationSuccessEvent>
{
@Override
public void onApplicationEvent (AuthenticationSuccessEvent event) {
// do what you want here
// example: persist event to the database
}
}
Consulte también esta respuesta aquí: https://stackoverflow.com/a/11384001/474034