Classification d'utilisation de la sécurité du printemps:
Je crois que tous ceux qui ont vécu à Baidu savent utiliser la sécurité du printemps. Il y a quatre usages, de simple à profond:
1. Aucune base de données n'est utilisée, toutes les données sont écrites dans le fichier de configuration, qui est également une démo dans le document officiel;
2. Utilisez la base de données et implémentez la conception de code par défaut de la base de données en fonction de Spring Security, ce qui signifie que la base de données a été corrigée, cette méthode est inflexible et que la base de données est conçue très simple et a une mauvaise praticité;
3. La sécurité du printemps est différente de l'Acegi. Il ne peut plus modifier le filtre par défaut, mais il prend en charge l'insertion de filtres, donc sur la base de cela, nous pouvons insérer nos propres filtres à usage flexible;
4. Moyens violents pour modifier le code source. La modification du filtre par défaut mentionné ci-dessus est juste de modifier le fichier de configuration pour remplacer le filtre. Cela modifie directement le code source à l'intérieur, mais cela ne se conforme pas au principe de conception OO, et n'est pas pratique et indisponible.
Cet article présente principalement le contenu pertinent sur la connexion d'authentification personnalisée Spring Security. Il est partagé pour votre référence et votre apprentissage. Je ne dirai pas beaucoup en dessous. Jetons un coup d'œil à l'introduction détaillée ensemble.
1. Résumé
1.1. Introduction
Spring Security est un cadre de sécurité basé sur les filtres Spring AOP et Servlet pour gérer l'authentification de l'autorisation, etc.
1.2. Processus d'authentification personnalisé de la sécurité
1) Processus d'authentification
Générer des authentification non authentifiées
↑ (obtenir des informations) (attribuer des fournisseurs selon AuthenticationToken) AuthenticationFilter -> AuthenticationManager -> AuthenticationProvider ↓ (Authentication) UserDetails (acquisition de base de données de requête générale) ↓ (PASS) Génération d'authentificationToken qui a été authentifiée avec succès ↓ (stockage) Consextholder SecurityCholder
2) Ajouter AuthenticationFilter à la chaîne de filtre de sécurité (configurée dans le serveur de ressources), comme:
http.addfilterBefore (AuthenticationFilter, abstractPreAuthenticatedProcessingFilter.class)
ou:
http.addfilterafter (AuthenticationFilter, usernamepasswordauthenticationfilter.class)
2. Prenez le connexion SMS comme exemple
2.1. Environnement de développement
2.2. Analyse du code de base
2.2.1. Processus d'authentification de connexion personnalisé
2.2.1.1. Jeton de connexion d'authentification personnalisée
/ ** * Token de connexion mobile * * @Author: Catalpaflat * / classe publique MobileLogInThenticationToken étend AbstractAuthenticationToken {private statique final SerialVersionUID = springSecurityCoreversion.Serial_version_Uid; Logger final statique privé = loggerfactory.getLogger (mobileLogInThenticationToken.class.getName ()); Principal d'objet final privé; public mobileLogInAuthenticationToken (String mobile) {super (null); this.principal = mobile; this.setAuthenticated (false); Logger.info ("MobileLogInThenticationToken setAuthenticated -> False Chargement ..."); } public MobileLogInAuthenticationToken (Principal d'objet, collection <? étend l'autorité accordé> Autorités) {Super (autorités); this.principal = principal; // doit utiliser Super, car nous l'emportons super.SetAuthenticated (true); Logger.info ("MobileLogInThenticationToken setAuthenticated -> True Chargement ..."); } @Override public void setAuthenticated (boolean authenticated) {if (authentifié) {lancez new illégalArgumentException ("ne peut pas définir ce jeton de confiance - utilisez le constructeur qui prend une liste d'authentification accorde à la place"); } super.setAuthenticated (false); } @Override public objet getCredentials () {return null; } @Override public objet getPrincipal () {return this.principal; } @Override public void erasecredentials () {super.erasecredentials (); }} Note:
setAuthenticated (): détermine si elle a été authentifiée
2.2.1.1. Filtre de connexion d'authentification personnalisée
/ ** * Filtre de connexion SMS mobile * * @Author: Catalpaflat * / classe publique MobileLogInThenticationFilter étend AbstractAuthenticationProcessingFilter {private boolean postonly = true; Logger final statique privé = loggerfactory.getLogger (mobileLogInThenticationFilter.class.getName ()); @Getter @setter private String mobileParameTername; public mobileLogInAuthenticationFilter (String mobileLoginurl, String mobileParametername, String httpMethod) {super (new antpathRequestmatcher (mobileLoginurl, httpMethod)); this.mobileParametername = mobileParametername; Logger.info ("MobileLogInThenticationFilter Chargement ..."); } @Override Public Authentication Tentient Authentication (demande httpservletRequest, HttpservletResponse Response) lance AuthenticationException, ioException, ServletException {if (postonly &&! Request.getMethod (). request.getMethod ()); } // Get Mobile String mobile = GettMobile (demande); // Assemblez le jeton mobileLogInAuthenticationToken AuthRequest = new MobileLogInThenticationToken (mobile); // Autoriser les sous-classes à définir les biens "Détails" SetDetails (Demande, AuthRequest); Renvoie ce.getAuthenticationManager (). Authenticiate (AuthRequest); } / ** * Détails pour définir l'authentification de l'identité * / private void SetDetails (demande httpsservletRequest, mobileLogInThenticationToken AuthRequest) {Authrequest.SetDetails (authenticationDetailSSource.BuildDetails (request)); } / ** * Obtenez le numéro de mobile * / private String obtientmobile (httpServLetRequest request) {return request.getParameter (mobileParametername); } public void setpostonly (boolean postonly) {this.postonly = postonly; }}Remarque: Méthode TentatingAuthentication ():
2.2.1.1. Fournisseur de connexion d'authentification personnalisée
/ ** * Proviseur d'authentification de connexion SMS mobile * * @author: catalpaflat * / classe publique MobileLogInAuthenticationProvider implémente AuthenticationProvider {Logger final statique privé Logger.class.getNaDame.getLogger (MobileLoginIthenticationProvider.class.getName ()); @Getter @Setter Private UserDetailSService CustomUserDetailSService; public mobileLogInAuthenticationProvider () {logger.info ("MobileLogInThenticationProvider Chargement ..."); } / ** * Authentification * / @Override Authentification publique Authentification (authentification Authentification) lève AuthenticationException {// Obtenir les informations de jeton encapsulées par le filtre MobileLoginIthentication AuthenticationToken = (mobileLogintenticationToken) Authentification; // Obtenez des informations utilisateur (Authentification de la base de données) UserDetails UserDetails = PustomUserDetailsService.LoadUserByUserName ((String) AuthenticationToken.GetPrincipal ()); // non passé if (userDetails == null) {lancez de nouveaux AuthenticationsServiceException ("Impossible d'obtenir des informations utilisateur"); } // par mobileLogInThenticationToken AuthenticationResult = new MobileLogInAuthenticationToken (UserDetails, userDetails.getAuthorities ()); authenticationResult.setDetails (authenticationToken.getDetails ()); Retour AuthenticationResult; } / ** * Selon le type de jeton, déterminez quel fournisseur utiliser * / @Override public booléen supports (classe <?> Authentification) {return mobileLogInThenticationToken.class.issignableFrom (authentification); }}Remarque: Méthode Authenticiate ()
2.2.1.1. Configuration d'authentification de connexion personnalisée
@Configuration (SpringBeanNameConstant.default_Custom_Mobile_Login_Authentication_Security_Config_Bn) Classe publique MobileLoginThenticationsEcurityConfig étend SecurityConfigureAdapter <defaultSecurityFilterChain, HTTPSEURT LoggerFactory.getLogger (MobileLogInThenticationsCurityConfig.class.getName ()); @Value ("$ {login.mobile.url}") String privé defaultMobileLoginurl; @Value ("$ {login.mobile.paramètre}") String privé defaultMobileLogInParameter; @Value ("$ {login.mobile.httpMethod}") String privé defaultMobileLoginHttpMethod; @Autowired Private CustomyMlConfig CustomyPyMlConfig; @Autowired Private UserDetailSService CustomUserDetAtailSservice; @Autowired Private AuthenticationsUccessHandler CustomAuthenticationsUccessHandler; @Autowired Private AuthenticationFailureHandler CustomAuthenticationFailureHandler; public mobileLogInAuthenticationsCurityConfig () {logger.info ("MobileLogInThenticationsCurityConfig chargement ..."); } @Override public void configure (httpsecurity http) lève une exception {mobilepojo mobile = customymlconfig.getLogins (). GetMobile (); String url = mobile.getUrl (); Paramètre de chaîne = mobile.getParameter (). GetMobile (); String httpMethod = mobile.gethttpMethod (); MobileLogInThenticationFilter mobileLogInAuthenticationFilter = new mobileLoginThenticationFilter (stringUtils.isblank (URL)? DefaultMobileLoginurl: URL, stringUtils.isblank (paramètre)? httpMethod); mobileLogInThenticationFilter.SetAuthenticationManager (http.getSharedObject (authenticationManager.class)); mobileLogInThenticationFilter.SetAuthenticationsUCcessHandler (CustomAuthenticationsUccessHandler); mobileLogInThenticationFilter.SetAuthenticationFailureHandler (CustomAuthenticationFailureHandler); MobileLoginThenticationProvider mobileLoginTauthenticationProvider = new MobileLogInAuthenticationProvider (); mobileLogInThenticationProvider.setCustomUserDetailSService (CustomUserDetailSService); http.AuthenticationProvider (mobileLogInThenticationProvider) .AddFilterAfter (mobileLogInThenticationFilter, usernamepasswordAuthenticationFilter.class); }}Remarque: Configure () Méthode
Instancier AuthenticationFilter et AuthenticationProvider
Ajoutez AuthenticationFilter et AuthenticationProvider à Spring Security.
2.2.2. Vérifiez le code de vérification personnalisé basé sur Redis
2.2.2.1. Filtre de code de vérification personnalisé basé sur redis
/ ** * Filtre de code de vérification * * @Author: Catalpaflat * / @ Component (SpringBeanNameConstant.Default_Validate_Code_Filter_Bn) Public Class ValidateCodeFilter étend une fois PEPEQUESTFILT Loggerfactory.getLogger (validateCodeFilter.class.getName ()); @Autowired Private CustomyMlConfig CustomyPyMlConfig; @Autowired Private ReDistetemplate <objet, objet> redesttemplate; / ** * classe d'outils qui vérifie si l'URL demandée correspond à l'URL configurée * / antpathmatcher privé PathMatcher = new antpathmatcher (); public validateCodeFilter () {logger.info ("Chargement validateCodeFilter ..."); } @Override Protected void dofilteRINNERNAL (HttpServLetRequest Request, HttpServletResponse Response, FilterChain FilterChain) lance ServletException, ioException {String url = CustomyPylConfig.getLogins (). GetMobile (). GetUrl (); if (pathmatcher.match (url, request.getRequestturi ())) {String DeviceId = request.geTheader ("DeviceId"); if (stringUtils.isblank (deviceId)) {throw new customexception (httpstatus.not_acceptable.value (), "pas deviceId dans la tête de la demande"); } String codeParamName = CustomyMlConfig.getLogins (). GetMobile (). GetParAmètre (). GetCode (); String code = request.getParameter (CodeParAmName); if (stringUtils.isblank (code)) {throw new customexception (httpstatus.not_acceptable.value (), "pas de code dans les paramètres de la demande"); } String key = systemConstant.default_mobile_key_pix + deviceID; SMSCODEPO SMSCODEPO = (SMSCODEPO) Redistemplate.OPSForValue (). Get (Key); if (smscodepo.isexPried ()) {Throw new Customexception (httpstatus.bad_request.value (), "Le code de vérification a expiré"); } String smscode = smscodepo.getcode (); if (stringUtils.isblank (smscode)) {throw new customexception (httpstatus.bad_request.value (), "le code de vérification n'existe pas"); } if (stringUtils.equals (code, smscode)) {redemplate.delete (key); // Let It Go FilterChain.Dofilter (demande, réponse); } else {Throw new Customexception (httpstatus.bad_request.value (), "le code de validation est incorrect"); }} else {// Let It Go FilterChain.Dofilter (demande, réponse); }}}Remarque: DoFilteRinternal ()
Vérification du filtre du code de vérification personnalisé
2.2.2.2. Ajouter un filtre de code de vérification personnalisé à la chaîne de filtre de sécurité Spring
http.addfilterbefore (validatecodefilter, abstractPreraThenticatedProcessingFilter.class)
Remarque: avant d'ajouter au filtre de prétraitement d'authentification
3. Testez l'effet
Enfin, l'adresse du code source est jointe: https://gitee.com/catalpaflat/springsecurity.git (téléchargement local)
Résumer
Ce qui précède est l'intégralité du contenu de cet article. J'espère que le contenu de cet article a une certaine valeur de référence pour l'étude ou le travail de chacun. Si vous avez des questions, vous pouvez laisser un message pour communiquer. Merci pour votre soutien à wulin.com.