【Shiro】¿Cómo verifica SimpleAuthenticationInfo la contraseña?

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.
inserte la descripción de la imagen aquí
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.
inserte la descripción de la imagen aquí

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
inserte la descripción de la imagen aquí
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.
inserte la descripción de la imagen aquí
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í.
inserte la descripción de la imagen 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 .
inserte la descripción de la imagen aquí

getCachedAuthenticationInfo analiza principalmente la memoria caché y el token para obtener información del usuario.
inserte la descripción de la imagen aquí

2, método assertCredentialsMatch (token, información)

inserte la descripción de la imagen aquí
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).
inserte la descripción de la imagen aquí
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.
inserte la descripción de la imagen aquí

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 doCredentialsMatchen 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.
inserte la descripción de la imagen aquí

4. Diagrama resumen

inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/weixin_42516475/article/details/130587699
Recomendado
Clasificación