Bases de Springsecurity
Dans l'article précédent "Utilisation de base de Springboot + Spring Security and Persualized Login Configuration", Springsecurity a été brièvement introduit, introduisant essentiellement l'interface et implémentant les fonctions. Cet article tente de faire une analyse simple du processus d'authentification de l'utilisateur du point de vue du code source.
Avant une analyse spécifique, nous pouvons d'abord consulter les principes généraux de Springsecurity:
Bases de Springsecurity
En fait, il est relativement simple, principalement à travers une série de filtres pour intercepter et traiter la demande.
Description du processus de traitement de la certification
Regardons directement UsernamePasswordAuthenticationFilter directement.
classe publique UserNamePasswordAuthenticationFilter étend AbstractAuthenticationProcessingFilter // Connectez-vous à la demande d'authentification Public Authentication Tensification) (HttpservletRequest {lancer une nouvelle authenticationserviceException ("Méthode d'authentification non prise en charge:" + request.getMethod ()); } else {// Obtenez l'utilisateur, mot de passe string username = this.obtainUsername (request); String mot de passe = this.obtainpassword (demande); if (username == null) {username = ""; } if (mot de passe == null) {mot de passe = ""; } username = username.trim (); // Génération de jetons, usernamepasswordAuthenticationToken AuthRequest = new userNamepasswordAuthenticationToken (nom d'utilisateur, mot de passe); this.setDetails (demande, authrequest); // Vérifiez en outre RETOUR this.getAuthenticationManager (). Authenticiate (AuthRequest); }}} Dans la méthode attemptAuthentication , l'essentiel est d'obtenir les valeurs de demande de nom d'utilisateur et de mot de passe, puis de générer un objet UsernamePasswordAuthenticationToken pour une vérification supplémentaire.
Mais nous pouvons d'abord examiner la méthode de construction de usernamepasswordauthenticationtoken
public userAmEpasswordAuthenticationToken (objet principal, information d'objet) {// Définir la permission vide super ((collection) null); this.principal = principal; this.Credentials = Creasatings; // Définissez si ce.SetAuthenticated (false);} En fait, UsernamePasswordAuthenticationToken est hérité de Authentication . Cet objet a été mentionné dans l'article précédent. Il s'agit d'un paramètre dans la méthode de rappel de connexion réussie, qui contient des paramètres tels que les informations de l'utilisateur, les informations de demande, etc.
Alors voyons
this.getAuthenticationManager (). Authenticiate (AuthRequest);
Il y a un authenticationManager ici, mais le véritable appel est ProviderManager .
Public Class ProviderManager implémente AuthenticationManager, MessageSourCaware, InitializingBean {Public Authentication Authentication (Authentication Authentication) lève AuthenticationException {class <? étend l'authentification> TOTEST = Authentication.getClass (); AuthenticationException LastException = null; Résultat d'authentification = null; Boolean Debug = Logger.IsDebugeNabled (); Iterator var6 = this.getProviders (). Iterator (); while (var6.hasnext ()) {AuthenticationProvider provider = (AuthenticationProvider) var6.next (); // 1. Déterminez s'il existe un fournisseur pour soutenir l'authentification if (fournisseur.Supports (Totest)) {// 2. True Logical Judgment Result = Provider.Authenticate (authentification); }}} Authentification publique Authentification (authentification Authentification) lève AuthenticationException {userDetails user = this.usercache.getUserFromCache (username); if (user == null) {cachewasused = false; // 1. Allez pour obtenir UserDetails User = this.RetReeSer (nom d'utilisateur, (userNamepasswordAuthenticationToken) Authentification); } essayez {// 2. Pre-Check this.preAuthenticationChecks.Check (utilisateur); // 3. Vérification supplémentaire (vérification du mot de passe) this.AdditionalAuthenticationChecks (utilisateur, (userAmEpasswordAuthenticationToken) Authentification); } catch (AuthenticationException var7) {} // 4. La dernière vérification this.PostAuthenticationChecks.Check (utilisateur); // 5. Renvoie la véritable authentification certifiée Retour. Les deux vérifications sur UserDetails ici sont principalement via ses quatre méthodes qui renvoient le type booléen.
Après vérification des informations, une authentification authentifiée est renvoyée par le biais de la méthode de construction de UsernamePasswordAuthenticationToken .
Après avoir obtenu l'authentification certifiée, SuccessHandler sera à nouveau appelé. Ou s'il échoue l'authentification, appelez l'échechandler.
Comment les résultats de l'authentification sont partagés entre plusieurs demandes
Après avoir terminé le processus de traitement de l'authentification de l'utilisateur, réfléchissons à la façon de partager le résultat d'authentification entre plusieurs demandes?
Parce qu'il n'y a pas de configuration pour cela, nous pouvons penser à la méthode par défaut qui devrait être de stocker le résultat d'authentification dans la session.
Alors, quand est-il stocké dans la session?
Nous pouvons continuer à examiner le code source du processus d'authentification. Après avoir réussi la méthode de la tentative d'authentification, si l'authentification est réussie, l'authentification réussie sera appelée. Dans cette méthode, non seulement SuccessHandler est appelé, mais aussi une ligne de code plus important
SecurityContexTholder.getContext (). SetAuthentication (AuthResult);
SecurityContexTholder est un package pour ThreadLocal. ThreadLocal est une classe de stockage de données à l'intérieur d'un thread. À travers l'informatique, les données peuvent être stockées dans un thread spécifié. Après le stockage des données, seules les données stockées peuvent être obtenues dans le thread spécifié, mais d'autres threads ne peuvent pas obtenir de données. Pour plus d'informations sur les principes du threadlocal, veuillez consulter mon article précédent.
D'une manière générale, les demandes et les retours de la même interface seront complétés dans un seul thread. Nous mettons AuthResult dans la sécurité de sécurité, et nous pouvons également le retirer ailleurs.
Enfin, l'AuthResult est récupérée à partir SecurityContextPersistenceFilter et la session est stockée.
SecurityContextPersistenceFilter est également un filtre, qui est à la pointe de la chaîne de filtre de sécurité entière, ce qui signifie que le filtre est passé pour la première fois lorsque la vérification est démarrée, et le dernier passage est finalement passé une fois la vérification terminée.
Obtenir des informations utilisateur authentifiées
/ ** * Obtenez actuellement l'utilisateur * @return complet d'authentification * / @ getMapping ("/ me1") Objet public currentUser () {return SecurityContexTholder.getContext (). userDetails * / @ getMapping ("/ me3") Objet public cuureNUser (@AuthenticationPrincipal UserDetails UserDetails) {return userDetails;}Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.