Código fuente de Spring Security (1): autenticación, autorización, cadena de filtro
Debido a que leí muchos blogs y descubrí que muchas personas tienen diferentes estilos de uso, estaba un poco confundido. Creo que la mejor manera es leer más código fuente y luego elegir cómo quieres usarlo.
Versión de seguridad de Spring: 2.1.6.RELEASE
Hablemos primero de la relación entre estos tres tipos
AutenticationManager, ProviderManager, AuthenticationProvider
Encapsula información de identidad del usuario
Una interfaz, solo un método
ProviderManager es la clase de implementación de AuthenticationManager, que proporciona un proceso y una lógica de implementación de autenticación básica;
Ver primero Este método es un método utilizado para la autenticación
Puntos clave
AuthenticationProvider en sí es una interfaz, que tiene la clase de implementación AbstractUserDetailsAuthenticationProvider y la subclase DaoAuthenticationProvider de AbstractUserDetailsAuthenticationProvider
Sólo dos métodos
Resumen
Esta es una clase abstracta y un patrón de plantilla. Después de definir el proceso de autenticación, implementemos algunos métodos de enlace en el proceso. Se logró el efecto de autenticación personalizada
La subclase de AbstractUserDetailsAuthenticationProvider implementa algunos métodos abstractos
retrieveUser
Utiliza principalmente UserDetailsService para encontrar usuarios
adicionalAuthenticationChecks
createSuccessAuthentication
La esencia es llamar al método de la clase principal, que consiste en crear una nueva autenticación y luego pasarle la información UserDetails
UserDetailsService es una interfaz que proporciona un método
Siento que esta interfaz es inútil. Se utiliza para administrar clases de usuarios.
SS funciona en segundo plano http basándose principalmente en filtros de servlet. Echemos un vistazo a qué es el filtro y cómo funciona en los servlets.
springSecurityFilterChain es una interfaz, DefaultSecurityFilterChain es su clase de implementación y hay una lista de filtros dentro de DefaultSecurityFilterChain. Con respecto a los filtros en SS y su orden de ejecución (Orden), puede ver la documentación oficial cuando. necesario Se utilizará al definir el filtro.
Cuando llega una solicitud, el filtro en SS actuará sobre la solicitud, como se muestra a continuación:
Arriba mencionamos que SS tiene su propia cadena de filtros, aquí hay una captura de pantalla: (El orden de ejecución es el de el orden establecido)
Hablemos de la lógica de procesamiento de varios filtros más importantes
Todo el proceso de llamada consiste en llamar primero al método AbstractAuthenticationProcessingFilter.doFilter() de su clase principal y luego ejecutarlo. UsernamePasswordAuthenticationFilter. método tryAuthentication() para verificación
La clase principal es AbstractAuthenticationProcessingFilter (también es un modo de plantilla, la subclase implementa métodos abstractos y la clase principal determina el proceso)
requireAuthentication
Determinar si se requiere el procesamiento del filtro actual es determinar la ruta, el método de solicitud, etc.
Tome el método de construcción de UsernamePasswordAuthenticationFilter como ejemplo
SuccessAuthentication
La autenticación aquí es el primer contenido de la sección (this.getAuthenticationManager().authenticate(authRequest))
Como se puede ver en el diagrama de secuencia de ejecución del filtro en lo anterior. En la figura, el filtro AnonymousAuthenticationFilter está después de filtros como UsernamePasswordAuthenticationFilter. Si está al frente Ninguno de los filtros se autenticó correctamente. Spring Security agregó una clase de implementación anónima AnonymousAuthenticationToken de Authenticaiton al SecurityContextHolder actual. p>
Filtro de manejo de excepciones ExceptionTranslationFilter, que se utiliza Maneja las excepciones lanzadas durante el proceso de autorización del certificado del sistema (es decir, el siguiente filtro FilterSecurityInterceptor), que maneja principalmente AuthenticationException y AccessDeniedException.
Este filtro es el último filtro en la cadena de filtros de autenticación y autorización. Después de este filtro, se solicita el servicio /xx real.
Spring Security utiliza AffirmativeBased de forma predeterminada para implementar la decisión. método de AccessDecisionManager Para lograr la autorización
Vaya a esta ubicación para autenticar la información del usuario actual, fl la ruta del recurso al que se accede actualmente y atribuye la decisión de la ruta del recurso actual (es decir, si se requiere autenticación). El resto es determinar si el rol del usuario actual Authentication.authorites tiene permiso para acceder al recurso actual fi
Análisis de la cadena de filtros centrales de Spring Security