Principe de mise en œuvre
Dans les articles précédents, nous avons introduit la méthode de connexion avec les mots de passe du compte ordinaires: Springboot + Spring Security Basic Utilisation et configuration de connexion personnalisée. Mais il existe maintenant une autre manière courante, qui est de se connecter directement via le code de vérification SMS de votre téléphone mobile. Ici, vous devez faire un travail supplémentaire par vous-même.
Toute personne qui a une certaine compréhension de l'explication détaillée du processus d'authentification de SpringSecurity sait que dans le processus d'authentification du mot de passe du compte, les catégories suivantes sont impliquées: usernamepasswordAuthenticationFilter (utilisée pour demander des informations sur les paramètres), le providerManager (pour la vérification de l'authentification),
Parce qu'il est connecté via le code de vérification SMS, nous devons réécrire les paramètres demandés, le processus d'authentification et les informations de jeton de connexion de l'utilisateur pour un certain montant.
Bien sûr, nous devons mettre le processus de code de vérification en premier, si le code de vérification graphique est implémenté de la même manière. L'avantage de cette approche est que le processus d'authentification du code de vérification est découplé afin que d'autres interfaces puissent également être utilisées.
Implémentation de base
Vérification du code de vérification
L'implémentation fonctionnelle du code de vérification SMS est en fait le même que le principe du code de vérification graphique. C'est juste que l'un est de renvoyer une image à l'avant, et l'autre est d'envoyer un court message à l'utilisateur. Ici, il vous suffit d'appeler l'interface du fournisseur de services SMS. Pour plus de principes, veuillez vous référer à Springboot + Springsecurity pour implémenter la fonction de code de vérification graphique.
Authentification
Lors de la connexion avec le mot de passe de votre compte, le UsernamePasswordAuthenticationToken contient le compte, le mot de passe de l'utilisateur, le mot de passe et d'autres informations d'état, telles qu'elle est disponible. Nous nous connectons via SMS sur le téléphone mobile, nous n'avons donc pas de mot de passe. Ici, nous copie simplement le code UsernamePasswordAuthenticationToken et supprimons les informations liées au mot de passe.
classe publique SmscodeAuthenticationToken étend AbstractAuthenticationToken {private static final long SerialVersionUID = springSecuritycoreversion.serial_version_uid; Principal d'objet final privé; public smscodeAuthenticationToken (String mobile) {super (null); this.principal = mobile; setAuthenticated (false); } public smscodeAuthenticationToken (directeur d'objet, collection <? étend l'autorité accorde> autorités) {super (autorités); this.principal = principal; super.setAuthenticated (true); // doit utiliser super, comme nous l'emportons} objet public getCredentials () {return null; } objet public getPrincipal () {return this.principal; } public void setAuthenticated (boolean isAuthenticated) lève illégalArgumentException {if (isAuthenticated) {lancez un nouveau constructeur illégalargumentException ("ne peut pas définir ce jeton de confiance - utilisez le constructeur qui prend une liste d'autorité accordé à la place"); } super.setAuthenticated (false); } @Override public void erasecredentials () {super.erasecredentials (); }} AuthenticationFilter
Dans le processus de connexion dans le mot de passe du compte, la valeur par défaut est UserNamePasswordAuthenticationFilter. Sa fonction consiste à obtenir le compte et le mot de passe à partir de la demande, de vérifier la méthode de la demande et de générer une authentification. Ici, nos paramètres ont changé d'une certaine manière, donc c'est toujours l'ancienne méthode, copier pour apporter des modifications simples
classe publique SmscodeAuthenticationFilter étend AbstractAuthenticationProcessingFilter {// Paramètres de demande clés de la chaîne privée mobileParameter = SecurityConstants.default_Parameter_Name_Mobile; // est-il uniquement pris en charge du post privé booléen postonly = true; public smscodeAuthenticationFilter () {// Demande l'URL de l'interface Super (nouveau antpathrequestmatcher (SecurityConstants.default_login_processing_url_mobile, "post")); } Public Authentification Tentatication (HttpServLetRequest Request, HttpservletResponse Response) lève AuthenticationException {if (Postonly &&! request.getMethod (). Equals ("Post")) {Throw New AuthenticationsserviceException ("Méthode d'authentification non prise en charge:" + request.getMethod ()); } // Obtenez la valeur de la demande en fonction du nom de paramètre de demande String mobile = GetMobile (demande); if (mobile == null) {mobile = ""; } mobile = mobile.trim (); // Générez l'authentification correspondanteToken SMScodeAuthenticationToken AuthRequest = new SmScodeAuthenticationToken (mobile); setDetails (request, authrequest); Renvoie ce.getAuthenticationManager (). Authenticiate (AuthRequest); } / ** * Obtenez le numéro de mobile * / String Protected obtientmobile (demande httpServleRequest) {return request.getParameter (mobileParameter); } // omettre le code non pertinent} Fournisseur
Pendant le processus de connexion du mot de passe du compte, l'exactitude du mot de passe et si le compte est disponible est vérifié via DaoAuthenticationProvider. Nous devons également mettre en œuvre un fournisseur nous-mêmes
classe publique smscodeAuthenticationProvider implémente AuthenticationProvider {private userDetailSService UserDetailSService; / ** * Vérification de la logique d'identité * @param authentification * @return * @throws authenticationException * / @Override Authentification publique Authentification (authentification Authentication) lève AuthenticationException {smscodeAuthenticationToken AuthenticationToken = (smScodeAuthenticationToken) Authentication; UserDetails user = userDetailsService.LoadUserByUserName ((String) AuthenticationToken.GetPrincipal ()); if (user == null) {lancez de nouveaux AuthenticationsServiceException ("Les informations utilisateur ne peuvent pas être obtenues"); } SmscodeAuthenticationToken AuthenticationResult = new smScodeAuthenticationToken (user, user.getAuthorities ()); authenticationResult.setDetails (authenticationToken.getDetails ()); Retour AuthenticationResult; } @Override public booléen supports (class <?> Authentication) {return smscodeAuthenticationToken.class.isassignableFrom (authentification); } public userDetailSService getUserDetailSService () {return userDetailSService; } public void SetUserDetailSService (userDetailSService UserDetailSService) {this.UserDetailSService = userDetailSService; }} Configuration
Le processus d'authentification principal est réalisé à travers les quatre processus ci-dessus. Ici, nous pouvons réduire leur configuration.
@ComponentPublic Class SmscodeAuthenticationsCurityConfig étend la sécurité de sécurité @Autowired Private AuthenticationFailureHandler MyAuthenticationFailureHandler; @Autowired private userDetailSService UserDetailSService; @Override public void configure (httpSecurity http) lève une exception {smscodeAuthenticationFilter smscodeAuthenticationFilter = new smscodeAuthenticationFilter (); smscodeAuthenticationFilter.setAuthenticationManager (http.getSharedObject (authenticationManager.class)); SMSCODEAUThenticationFilter.SetAuthenticationsUccessHandler (MyAuthenticationsuCcessHandler); smscodeAuthenticationFilter.SetAuthenticationFailureHandler (myAuthenticationFailureHandler); SmscodeAuthenticationProvider smscodeAuthenticationProvider = new smscodeAuthenticationProvider (); smscodeAuthenticationProvider.SetUserDetailSService (userDetailSService); http.AuthenticationProvider (smscodeAuthenticationProvider) .AddFilterAfter (smscodeAuthenticationFilter, userNamepasswordAuthenticationFilter.class); }} // BrowersecurityConfig.java@overrideprotected void configure (httpsecurity http) lève une exception {http.apply (smscodeAuthenticationsCurityConfig);} Téléchargement de code
Sécurité du printemps
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.