j_spring_security_check - ¿Cuál es el AuthenticationManager predeterminado en Spring-Security? ¿Cómo se autentica?
spring security login (2)
Tengo el siguiente bean definido:
<sec:authentication-manager alias="authenticationManager">
<sec:authentication-provider
user-service-ref="userDetailsService" />
</sec:authentication-manager>
Supongo que aquí Spring utiliza alguna implementación predeterminada de AuthenticationManager
.
En mi código Java tengo:
@Resource(name = "authenticationManager")
private AuthenticationManager authenticationManager; // specific for Spring Security
public boolean login(String username, String password) {
try {
Authentication authenticate = authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(username, password));
if (authenticate.isAuthenticated()) {
SecurityContextHolder.getContext().setAuthentication(authenticate);
return true;
}
}
catch (AuthenticationException e) {
}
return false;
}
Aquí se llama AuthenticationManager.authenticate(...)
. Pero me gustaría saber qué implementación de AuthenticationManager
Spring usa de forma predeterminada y qué hace su authenticate(...)
para autenticarse (es decir, asegúrese de que el nombre de usuario coincida con la contraseña).
¿Podrías explicar esto?
Spring Security solo envía una implementación real de AuthenticationManager
:
org.springframework.security.authentication.ProviderManager
Esto usa AuthenticationProvider
diferente para las tareas de autenticación
AuthenticationManagerBeanDefinitionParser
es responsable de analizar <sec:authentication-manager>
sus estados de documentación de Java:
Registra el ProviderManager central utilizado por la configuración del espacio de nombres, y permite la configuración de un alias, lo que permite a los usuarios hacer referencia a él en sus beans y ver claramente de dónde viene el nombre.
Crea el ProviderManager
y agrega las ofertas especificadas. Si no se especifica ninguna NullAuthenticationProvider
en el xml, entonces agrega un NullAuthenticationProvider
. Esto es, al menos, un proveedor que hace notar que no se previenen las excepciones de configuración.
AuthenticationManager
es realmente solo un contenedor para los proveedores de autenticación, que les proporciona una interfaz coherente. En la mayoría de los casos, el AuthenticationManager
predeterminado es más que suficiente.
Cuando usted llama
.authenticate(new UsernamePasswordAuthenticationToken(username, password))`
está pasando el UsernamePasswordAuthenticationToken
al AuthenticationProvider
predeterminado, que usará userDetailsService
para obtener al usuario en función del nombre de usuario y comparar la contraseña de ese usuario con la del token de autenticación.
En general, AuthenticationManager
transfiere algún tipo de AuthenticationToken
a cada uno de sus AuthenticationProviders
y cada uno lo inspecciona y, si pueden usarlo para autenticarse, regresan con una indicación de "Autenticado", "No autenticado" o "No se pudo autenticar". "(lo que indica que el proveedor no sabía cómo manejar el token, por lo que pasó a procesarlo)
Este es el mecanismo que le permite conectar otros esquemas de autenticación, como la autenticación contra un servidor LDAP o Active Directory, o OpenID, y es uno de los principales puntos de extensión dentro del marco de Spring Security.