I. Introducción
La clave de todo el artículo es saber de quién es el método doGetAuthenticationInfo reescrito por la clase ShiroRealm.
De la figura anterior, podemos saber que ShiroRealm finalmente heredó el método de AuthenticatingRealm.
2. Clase personalizada de ShiroRealm
pd: La nota en ① en la imagen es un entendimiento preconcebido cuando no ha visto la capa inferior.
En el ShiroRealm personalizado, parece que la verificación es ①, pero solo se crea una SimpleAuthenticationInfo对象
, y finalmente ② regresa y desaparece.
Como novato, probé Debug para encontrar el código real que se ejecutaría, pero solo salté a la clase SimpleAuthenticationInfo y finalmente no encontré nada.
Miremos hacia atrás a ShiroRealm, que hereda AuthorizingRealm y
entra en AuthorizingRealm. Encontrará que todavía no hay nada, pero notará que hereda AuthenticatingRealm (su relación es como se muestra en el prefacio).
3. Autenticación de la clase Realm
En esta clase, se puede encontrar a través de Find que la clase AuthenticatingRealm contiene métodos abstractos doGetAuthenticationInfo
, lo que significa que @Override en ShiroRealm lo es.
Veamos quién llamó a este método, y finalmente podemos encontrar que en la clase AuthenticatingRealm, getAuthenticationInfo()
② en el método llama a este método, es decir, el contenido de nuestro retorno en ShiroRealm está aquí.
Hablando de eso, veamos ① y ③ respectivamente.
1. método getCachedAuthenticationInfo(token)
① Por el significado literal, el parámetro y el nombre de la clase del objeto final, podemos saber que este es para obtener el nombre de usuario y la contraseña en el token.
- Suplemento: los amigos con buena vista encontrarán que en la figura anterior, se devuelven ① y ②
info
(clase AuthenticationInfo); la lógica del código es:
// 通过缓存和token获取用户信息
info = getCachedAuthenticationInfo(token);
// 用户信息不存在
if(info == null){
// 在ShiroRealm中@Override,获取登录用户的信息
info = doGetAuthenticationInfo(token);
...
}
La clase AuthenticationInfo (como se muestra en la figura a continuación) es algo similar a AuthenticationToken. Puede expandirla para ver el sistema shiro AuthenticationToken .
getCachedAuthenticationInfo analiza principalmente la memoria caché y el token para obtener información del usuario.
2, método assertCredentialsMatch (token, información)
En este método CredentialsMatcher()
, aunque no sé lo que es, el método del objeto se llama en el siguiente if cm.doCredentialsMatch(token, info)
.
Desde la interfaz, puede ver que hay 4 clases de implementación, no es una tontería, después de leerlas una por una, descubrí que la primera solo devuelve verdadero, la segunda maneja aquellas con sal, la cuarta maneja aquellas sin sal, y el tercero regresa demasiado No miré de cerca después de mucho tiempo.
En cambio, la sal debería ser lo que buscamos.
pd: El cifrado es un poco difícil para Xiaobai, así que no entraré en eso por el momento. Aquellos que estén interesados pueden ir y echar un vistazo.
Como puede ver aquí, sabemos que doCredentialsMatch
en el método, los datos descifrados por el token son los mismos que los datos en la base de datos, y se devolverá verdadero, lo que significa que se pasó la verificación.
Si se devuelve false, se lanzará IncorrectCredentialsException
(consulte la primera imagen del método assertCredentialsMatch(token, info)), y la excepción se detectará en el controlador y se devolverá al front-end.