Logique du code de vérification
J'ai également fait des codes de vérification dans des projets auparavant. Il existe de nombreux codes sur Internet qui génèrent des codes de vérification, et certains packages de jar tiers peuvent également générer de beaux codes de vérification. La logique du code de vérification est très simple. Il s'agit de mettre une balise d'image sur la page de connexion et SRC pointe vers un contrôleur. Ce contrôleur renvoie l'image générée et renvoie le flux de sortie vers la page. Lors de la génération de l'image, le texte de l'image est placé dans la session. Lorsque vous vous connectez, apportez le code de vérification entré et retirez-le de la session. Comparez les deux. L'enseignant a déclaré que l'utilisation du code de vérification intégré Spring Security est la même que ce que j'ai dit, mais qu'elle est plus standardisée et générale.
Spring Security est une série de chaînes de filtre, donc ici le code de vérification est également déclaré comme un filtre, ajouté avant le filtre de connexion de la chaîne de filtre, puis personnalisez une classe d'exception pour répondre au message d'erreur du code de vérification.
Structure du code:
Le code de vérification est placé dans le projet de base et la configuration est effectuée dans le projet du navigateur.
Code principal:
1. ImageCode:
Premièrement, la classe ImageCode résume l'image, le texte et le temps d'expiration du code de vérification
Package com.imooc.security.core.validate.code; import java.awt.image.bufferedImage; import java.time.localatetime; import java.time.localtime; / ** * Verification Code * ClassName: ImageCode * @Description: Code de vérification * @Author lihaoyang * @Date mars 1, 2018 * / Croche publique ImageCode @Author lihaoyn * @Date mars 1, 2018 * / Public Classic Image de tamponage; code de chaîne privé; Private LocalDateTime Expiretime; // Expiration Time Point / ** * * <p> Description: </p> * @param image * @param code * @param expiretn this.image = image; this.code = code; // Temps d'expiration = heure actuelle + nombre de secondes expirées this.expiretime = localDateTime.now (). PlussEcondes (expiretn); } public ImageCode (image BufferedImage, code de chaîne, LocalDatetime Expiretime) {super (); this.image = image; this.code = code; this.expiretime = Expiretime; } / ** * Si le code de vérification a expiré * @Description: si le code de vérification a expiré * @param @return true expiré, false non expiré * @return booléen true expiré, false non expiré * @throws * @author lihaoyang * @date mars 2, 2018 * / public boolean isExpired () {return walledateTetime.Now (). } public BufferedImage getImage () {return image; } public void setimage (BufferedImage Image) {this.image = image; } public String getCode () {return code; } public void setCode (String code) {this.code = code; } public localDateTime getExpiretime () {return Expiretime; } public void setExpiretime (localDateTime Expiretime) {this.expiretime = Expiretime; }}VerifyCode: une classe d'outils pour générer des codes de vérification. Ici http://www.cnblogs.com/lihaoyang/p/7131512.html, bien sûr, vous pouvez également utiliser des packages de jar tiers, cela n'a pas d'importance.
ValidateCodeEException : Exception du code de vérification encapsulé
/ ** * @title: validateCodeException.java * @package com.imooc.security.core.validate.code * @description: todo * @author lihaoyang * @date 2 mars 2018 * / package com.imooc.security.core.valida.code; org.springframework.security.core.AuthenticationException; / ** * className: validateCodeException * @description: Exception d'erreur de code de vérification, exception d'authentification Héritage de Spring Security * @author lihaoyang * @Date Mars * / private statique final long SerialVersionUID = 1l; public validateCodeException (String msg) {super (msg); }}ValidateCodeFilter : filtre de code de vérification
Logique: héritage de UNEEPERREQUESTFILTER garantit que le filtre ne sera appelé qu'une seule fois à chaque fois (je ne sais pas pourquoi), injecté dans le processeur d'échec de l'authentification, et appelé lorsque la vérification a échoué.
package com.imooc.security.core.validate.code; import java.io.ioexception; import javax.servlet.filterchain; import javax.servlet.servletException; import javax.servlet.http.httpservletRegrand org.apache.commons.lang.stringutils; import org.springframework.security.web.authentication.authenticationfailurehandler; import org.springframework.social.connect.web.httpsessionsessionstrategy; import org.springframework.social.connect.web.ssestrate; org.springframework.web.bind.servletRequestBindingException; import org.springframework.web.bind.servletRequestUtils; import org.springframework.web.context.request.servletwebrequest; import org.springframework.web.filter.onceperrequeter; Le filtre de code de vérification de connexion * ClassName: validateCodeFilter * @Description: * Une foispperRequestFilter: L'outil fourni par Spring garantit que le filtre ne sera appelé qu'une seule fois à chaque fois * @author lihaoyang * @Date 2 mars 2018 * / public class ValidateCodeFilter étend une fois une fois la question de la demande AuthenticationFailureHandler; // Obtenir la classe d'outils de session SessionStrategy SessionStrategy = new httpSessionessionsStrategy (); @Override Protected void dofilteRINNERNAL (HttpServLetRequest Request, HttpservletResponse Response, FilterChain FilterChain) lance ServletException, ioException {// If Il s'agit d'une demande de connexion, exécuter if (stringUtils.equals ("/ authentication / form" && stringUtils.equalSignoreCase (request.getMethod (), "Post")) {try {valider (new ServletWeBRequest (request)); } catch (validateCodeException e) {// appelant le gestionnaire d'erreur et appelant enfin sa propre authentificationFailureHandler.onauthenticationFailure (demande, réponse, e); return; // terminant la méthode, n'appelant plus la chaîne de filtre}} // pas une demande de connexion, appelez une autre chaîne de filtre filterchain.dofilter (demande, réponse); } / ** * Code de vérification de vérification * @Description: Code de vérification de vérification * @param @param demande * @param @throws servLetRequestBinDingException * @return void * @throws validateCodeException * @Author lihaoyang * @date March 2, 2018 * / private Void Validing (ServitweBrequest request) thorrow L'objet ImageCode dans la session ImageCode ImageCodeInsession = (ImageCode) SessionStrategy.getAttribute (demande, validateCodeController.Session_Key); // supprime le code de vérification dans la chaîne de demande ImageCodeInRequest = ServLetRequestUtils.getStringParameter (request.getRequest (), "ImageCode"); // Vérifiez if (stringUtils.isblank (ImageCodeInRequest)) {Throw New ValidateCodeException ("Le code de vérification ne peut pas être vide"); } if (ImageCodeInsession == null) {Throw New ValidateCodeException ("Le code de vérification n'existe pas, veuillez actualiser le code de vérification"); } if (ImageCodeInsession.isexPired ()) {// Supprimez le code de vérification expiré de la session SessionStrategy.RemoveAtTribute (request, validateCodeController.Session_Key); Jetez un nouveau validateCodeEException ("Le code de vérification a expiré, veuillez actualiser le code de vérification"); } if (! stringUtils.equalSignoreCase (ImageCodeInsession.getCode (), ImageCodeInRequest)) {Throw New ValidateDeException ("Vérification Code Erreur"); } // Vérification est adoptée, supprimez le code de vérification dans la session SessionStrategy.RemoveAttribute (demande, validatecodeController.Session_Key); } public AuthenticationFailureHandler getAuthenticationFailureHandler () {return AuthenticationFailureHandler; } public void setAuthenticationFailureHandler (AuthenticationFailureHandler AuthenticationFailureHandler) {this.authenticationFailureHandler = AuthenticationFailureHandler; }}ValidateCodeController : générer un contrôle de code de vérification
package com.imooc.security.core.validate.code; import java.io.ioException; import javax.imageio.imageio; import javax.servlet.http.httpservletRequest; import javax.servlet.http.httpservletRequest; import; org.springframework.social.connect.web.httpSessionessionStrategy; import org.springframework.social.connect.web.sessionstrategy; import org.springframework.web.bind.annotation.getmapping; import org.springframework.web.bind.annotation.restController; org.springframework.web.context.request.servletwebRequest; / ** * Verification CodeControl * classname: validateCodeController * @description: todo * @author lihaoyang * @date Marche 1, 2018 * / @ restcontrollerpublic class ValidateCodeConTroller {public static string Session_ "Session_key_image_code"; // Obtenez une session privée SessionStrategy SessionStrategy = new HttpSessionsSisionsTrategy (); @GetMapping ("/ VerifyCode / Image") public void createCode (HttpServLetRequest Request, httpservletResponse réponse) lève ioException {ImageCode ImageCode = CreateImageCode (request, réponse); SessionStrategy.SetAttribute (new ServletWebRequest (demande), Session_Key, ImageCode); ImageIo.Write (ImageCode.getImage (), "JPEG", Response.getOutputStream ()); } ImageCode privé CreateImageCode (HttpServLetRequest Request, HttpServletResponse Response) {VerifyCode VerifyCode = new VerifyCode (); return new ImageCode (VerifyCode.getImage (), VerifyCode.getText (), 60); }}Configuration du filtre dans BrowserseSecurityConfig :
package com.imooc.security.browser; import org.springframework.beans.factory.annotation.autowired; import org.springframework.context.annotation.bean; import org.springframework.context.annotation.configuration; import; org.springframework.security.config.annotation.web.configuration.webSecurityConfigurerAdapter; import org.springframework.security.crypt.bcrypt.bcryptpasswordCcoder; org.springframework.security.web.authentication.authenticationfailurehandler; import org.springframework.security.web.authentication.authenticationfailurehandler; import org.springframework.security.web.authentication.usermatasswordAuthenticationFilter; import; com.imooc.security.core.properties.securityproperties; import com.imooc.security.core.validate.code.validatecodefilter; @configuration // Il s'agit d'une configuration de classe publique BrowsersecurityConfig prolonge la configuration de la configuration de la configuration de la configuration de la logicielle @AuredProperties {// Read SécuritéProperties; // Processeur personnalisé après une connexion réussie @Autowired Private AuthenticationsUccessHandler ImoocAuthenticationsUCcessHandler; // Processeur défaillant de l'authentification personnalisée @Autowired Private AuthenticationFailureHandler imoocauthenticationFailureHandler; // Notez qu'il s'agit d'org.springframework.security.crypto.password.password encoder @bean public passwordSwayCoder PasswordCoder () {// bCryptPasswordEncoder implémente le mot de passe-net } // version 2: page de connexion configurable @Override Protected void configure (httpSecurity http) lève exception {// validateCodeFilter validateCodeFilter validateCodeFilter = new validateCodeFilter (); // Utilisez votre propre gestion des erreurs dans le filtre de code de vérification pour validateCodeFilter.SetAuthenticationFailureHandler (IMOOCAuthenticationFailureHandler); // Implémentez l'interface qui nécessite une authentification pour sauter la connexion du formulaire, Security = Authentication + Authorization //http.httpbasic () // Il s'agit de l'authentification par défaut de la boîte pop-up // http.addfilterBefore (validatecodeFilter, userAmpasswordAuthenticationFilter.Class) // Charger le filtre de code de vertige avant le Login Filter.Filter () // Chargez le filtre de code Verrification avant le Login Filter. // Formul Authentication.LoginPage ("/ Authentication / Require") // Processus User Authentication BrowserseSecurityContrller // Connectez-vous dans Filter UserAmPasswordAuthenticationFilter L'URL de connexion par défaut est "/ Login", qui peut être modifié ici.loginProcessingUrUlUl ("/ Authentication") .SuccessHandler (ImoocAuthenticationsUCcessHandler) // Authentification personnalisée Postprocessor.failureHandler (imoocautenticationfailurehandler) // Traitement après défaillance de connexion.and () .AuthorizErestS () // Les éléments suivants sont toutes SecurityProperties.GetBrowser (). GetLogInPage (): Page de connexion configurée par l'utilisateur.Antmatchers ("/ Authentication / Require", SecurityProperties.GetBrowser (). GetLoginPage (), // Enregistrer la page de connexion mais pas filtrer, autrement une erreur "/ VerifyCode / Image"). request.Authenticated () // L'authentification d'identité est requise.and () .csrf (). Disable () // La protection crypto est désactivée; }}Page de connexion: La page de connexion est faite relativement à peu près. En fait, le code de vérification peut être vérifié lorsque l'entrée du code de vérification perd la mise au point. Vous pouvez également utiliser une image de clic pour actualiser la fonction de code de vérification, donc je ne le ferai pas ici.
Page de connexion <body> Demo. <br> <formulaire Action = "/ Authentication / Form" Method = "Post"> <s table <td> </td> </tr> <tr> <td> Code de vérification: </td> <td> <input type = "text" name = "Imagecode" /> </ td> <td> <img src = "/ vérifiedcode / image" /> </ td> </tr> <tr> <td colpan = "2" align = "droite"> </ tr> <tr> <td Colspan = "2" ALLIGNE = "Drut"> </ Tr> <Tr> <td Colspan = "2" ALLIGNE = "Drut"> </ Tr> <TR> <TD COLSPAN = "2" ALLING = " Type = "Soumider"> Login </ Button> </td> </tr> </ Table> </ Form> </ Body>
Visitez http: // localhost: 8080 / démo-login.html:
Répondre aux informations d'exception personnalisées
La fonction générale n'est pas un problème. Mais il n'est pas assez universel, comme la largeur et la hauteur de l'image du code de vérification, le temps d'expiration, l'URL filtrée et la logique du code de vérification sont tous écrits à mort. Ceux-ci peuvent être rendus vivants, et maintenant les avantages de transformer les codes de vérification en filtre sont reflétés. Nous pouvons configurer les URL qui doivent être filtrées. Parfois, il peut non seulement nécessiter des codes de vérification sur la page de connexion, ce qui est plus général.
1. Les paramètres de base du code de vérification pour la modification de la généralisation peuvent être appariés
Il est transformé en configurable et l'application fait référence au module et la configure lui-même. S'il ne configure pas, utilisez la configuration par défaut. De plus, la configuration peut être déclarée dans l'URL de demande ou dans l'application. L'enseignant est en effet un enseignant et le code est très polyvalent!
L'effet que je souhaite réaliser est de faire une telle configuration dans l'application.properties:
#Verification Code Largeur d'image, hauteur, nombre de caractères Imooc.security.code.image.width = 100imooc.security.code.image.height = 30imooc.security.code.image.length = 6
Ensuite, vous pouvez contrôler l'effet du code de vérification. Étant donné que le code de vérification est également divisé en code de vérification d'image et code de vérification SMS, vous pouvez utiliser un niveau .code.image, qui utilise le fichier de configuration personnalisé de Springboot et doit déclarer la classe Java correspondante:
L'attribut de code doit être déclaré dans SecurityProperties:
Package com.imooc.security.core.properties; import org.springframework.boot.context.properties.configurationproperties; import org.springframework.context.annotation.configuration; / ** * éléments de configuration personnalisés * ClassName: SecurityProperties * @Descripting: Condération personnalisée Éléments de configuration * This ClassName Lire les éléments de configuration de la sécurité * IMOOC.Security dans Application.Properties * * imooc.security.browser.loginpage = /demo-login.html * La configuration du navigateur sera lue dans BrowserProperties * Ceci est divisé par des points, et le niveau et le niveau correspondent aux attributs de la classe * @Author lihaoyang * @Date 28, 2018 * / @ ConfigurationProperties (prefix = "imooc.security") public class SecurityProperties {private BrowserProperties Browser = new BrowserProperties (); Code privé ValidateCodeProperties = new ValidateCodeProperties (); public BrowserProperties getBrowser () {RETOUR BROWSER; } public void setBrowser (BrowserProperties Browser) {this.browser = Browser; } public validateCodeProperties getCode () {return code; } public void setCode (validateCodeProperties code) {this.code = code; }}Validatecodeproperties:
Package com.imooc.security.core.properties; / ** * Configuration du code de vérification * ClassName: validatecodeproperties * @description: configuration du code de vérification, le code de vérification comprend le code de vérification d'image, le code de vérification SMS, etc. Configuration Private ImageCodeProperties Image = new ImageCodeProperties (); public ImageCodeProperties getImage () {return image; } public void setimage (imagecodeProperties image) {this.image = image; }}ImageCodeProperties:
Package com.imooc.security.core.properties; / ** * Classe de configuration du code de vérification d'image * ClassName: ImageCodeProperties * @Description: Image Verification Code Class * @Author lihaoyang * @Date mars 2, 2018 * / public class ImageCoDeproperties {// Image Wideth Int width = 67; // Hauteur d'image privé int hauteur = 23; // Nombre de caractères de code de vérification private int longueur = 4; // Temps d'expiration privé int expirein = 60; public int getWidth () {return largeur; } public void setWidth (int largeth) {this.width = width; } public int getheight () {return height; } public void Setheight (int height) {this.height = height; } public int getLength () {return longueur; } public void setLength (int longueur) {this.length = longueur; } public int getExpireIn () {return expirein; } public void setExpireIn (int expirein) {this.expirein = expirein; }}Pour la configuration au niveau de la demande, si la demande contient les paramètres de code de vérification, utilisez la demande:
La méthode CreateImageCode de validatecodeController est utilisée pour le contrôler pour déterminer si les paramètres de demande ont ces paramètres. Si c'est le cas, il est transmis à la classe de génération de code de vérification VerifyCode, qui peut être contrôlé dynamiquement pendant la génération.
ImageCode privé CreateImageCode (demande HttpServletRequest, réponse httpservletResponse) {// Lisez d'abord la longueur, la largeur et les paramètres du nombre de caractères de la demande, s'il y a, utilisez-le, et par défaut int width = servletRequestCode.getIntParamètre (demande, "width", SecurityProperties.getcode (). GetImage (). GetWerth ()); int height = servletRequestUtils.getIntParameter (demande, "hauteur", SecurityProperties.getcode (). getImage (). Getheight ()); int charngled = this.securityproperties.getcode (). getImage (). getLength (); VerifyCode VerifyCode = new VerifyCode (largeur, hauteur, Charlength); return new ImageCode (VerifyCode.getImage (), VerifyCode.getText (), this.securityProperties.getcode (). getImage (). GetExpireIn ()); }VerifyCode:
public VerifyCode (int w, int h, int charlurng) {super (); this.w = w; this.h = h; this.charLength = Charlong; }Expérience: faites la configuration au niveau de l'application dans un projet de démonstration
Connectez-vous au formulaire pour effectuer une configuration au niveau de la demande
<img src = "/ VerifyCode / image? width = 200" />
accéder:
La longueur est le paramètre 200 de la bande de scène de demande, la hauteur est de 30 et les caractères sont configurés.
2. L'interface pour l'interception du code de vérification de la modification universelle peut être configurée
Le premier effet est de configurer dynamiquement les interfaces qui doivent être interceptées dans application.properties :
ImageCodeProperties a ajouté un nouvel attribut: private String url ; // L'URL interceptée doit correspondre à la configuration de l'image ci-dessus.
Core, le filtre de code de vérification doit être modifié:
1. Déclarez un ensemble SET dans l'intercepteur pour stocker les URL configurées dans le fichier de configuration qui doivent être interceptées.
2. Implémentez l'interface InitializingBean. Objectif: Lorsque tous les autres paramètres sont assemblés, initialisez la valeur des URL qui doivent être interceptées et réécrivez la méthode AfterProperTeset pour l'implémenter.
3. Injecter SecurityProperties et lire le fichier de configuration
4. Instancier la classe d'outils Antpathmatcher, qui est un match
5. Définissez le BrowseSeSecurityConfig dans le projet de navigateur pour appeler la méthode AfterProperTesTet.
6. Configurez l'URL à filtrer dans l'application. PROPERTIES DU PROJET DE Demo qui fait référence au module.
ValidateCodeFilter:
/ ** * Traitez le filtre de code de vérification de connexion Filtre * ClassName: validatecodeFilter * @description: * Hériter les outils fournis par une fois PEPEQUESTFILTER: Spring pour s'assurer que le filtre sera appelé une fois une fois à chaque fois * Implémentez le but de l'interface initialisée: * Lorsque d'autres paramètres sont assemblés, initialisez la valeur de la marche, ce qui doit être intercepté * @aThor lihaO 2018 * / classe publique ValidateCodeFilter étend une fois quePerRequestFilter implémente InitializationBean {// Authentification Failli le processeur privé AuthenticationFailureHandler AuthenticationFailureHandler; // Obtenir la classe d'outils de session SessionStrategy SessionStrategy = new httpSessionessionsStrategy (); // La collection URL qui doit être interceptée par ensemble privé <string> urls = new HashSet <> (); // Lire la configuration Private SecurityProperties SecurityProperties; // Spring Tool Class private antpathmatcher antpathmatcher = new antpathmatcher (); @Override public void AfterProperTesTet () lève Servlexception {super.AfterPropertiESTET (); // Lire les URL de la chaîne interceptée configurée [] configurls = stringUtils.splitBywHoleSeparatorPreserAllTokens (SecurityProperties.Getcode (). GetImage (). GetUrl (), "); for (String configurl: configurls) {urls.add (configurl); } // Les demandes de connexion doivent intercepter url.add ("/ authentification / formulaire"); } @Override Protected void DoFilteRINNERNAL (HttpServLetRequest Request, HttpServletResponse Response, FilterChain FilterChain) lève ServletException, ioException {/ ** * Code de vérification configurable Vérification * Déterminer si l'action URL et FACT; for (String URL: URLS) {if (antpathmatcher.match (url, request.getRequeSturi ())) {action = true; }} if (action) {try {valider (new servLebRequest (request)); } catch (validateCodeException e) {// appelant le gestionnaire d'erreur et appelant enfin sa propre authentificationFailureHandler.onauthenticationFailure (demande, réponse, e); return; // terminant la méthode, n'appelant plus la chaîne de filtre}} // pas une demande de connexion, appelez d'autres chaînes de filtre filterchain.dofilter (demande, réponse); } // omettant du code non pertinent ,,}BrowserseCurityConfig:
Configurer l'URL:
#Verification Code Intercept Interface Configuration iMooc.security.code.image.url = / user, / user / *
Test: / user / user / 1 a été intercepté
Visitez la page de connexion sans écrire le code de vérification:
Conforme aux attentes. À ce stade, la configuration dynamique de l'interface d'interception est terminée
3. La logique de génération de code de vérification peut être configurable
Les programmes les mieux écrits ont généralement des interfaces ouvertes, permettant aux utilisateurs de personnaliser l'implémentation. S'ils n'implémentent pas, utilisez l'implémentation par défaut. Faisons cela afin que la génération de codes de vérification puisse être implémentée par elles-mêmes. Si vous souhaitez rendre la logique de génération de code de vérification configurable, vous ne pouvez pas simplement écrire une classe du générateur de code de vérification d'image. Vous devez extraire la génération de code de vérification dans une interface validatecodegenerator, une méthode pour générer du générateur de code de vérification (). Étant donné que le code de vérification a également un code de vérification d'image, un code de vérification SMS, etc., nous faisons une implémentation par défaut dans notre module de vérification, tel que le code d'implémentation de code d'image Implémentation Implémentation ImageCodeGenerator. Dans ImageCodeGenerator, nous n'ajoutons pas d'annotation @component à cette classe. Utilisez ensuite la classe de configuration ValidateCodeBeanConfig qui écrit un bean de code de vérification. Cette classe de configuration configure divers Beans d'implémentation de code de vérification requis, tels que l'image de vérification d'image Implémentation Implémentation ImageCodeGenerator, SMS Verification Code, etc. Leurs types de retour sont tous ValidateCodeGenerator. Utilisez la @conditionalonMissingBean (name = "ImageCodeGenerator") Annotation. Il peut être jugé que si le conteneur à ressort actuel a un bean nommé ImageCodeGenerator, il sera utilisé, et s'il n'y a pas de configuration, donc si d'autres se réfèrent à votre module, si d'autres implémentent le code de vérification pour générer l'interface ValidateCodeGenerator, ils configurent le nom de la classe d'implémentation pour être imaginaire ImageCodeGenerator, et utilisent leur propre implémentation, donc que le programme est étendable.
Code principal:
Interface du générateur de code ValidateCodeGenerator:
Package com.imooc.security.core.validate.code; import org.springframework.web.context.request.servletwebrequest; / ** * Interface de génération de code de vérification * ClassName: validateCodeGenerator * @Description: ToDo * @AutoTor lihaoyang * @date mars 2, 2018 * / interface publique ValEdatorat * Interface de génération de code de vérification d'image * @Description: todo * @param @param demande * @param @return * @return ImageCode * @Throws * @author lihaoyang * @Date 2 mars 2018 * / ImageCode Générateur (ServletWeBrequest Request);};
Le générateur de code de vérification d'image implémente ImageCodeGenerator:
package com.imooc.security.core.validate.code; import org.springframework.beans.factory.annotation.autowired; import org.springframework.sterreotype.component; import org.springframework.web.bind.servletrequestutils; org.springframework.web.context.request.servletwebrequest; import com.imooc.security.core.properties.securityProperties; / ** * Image Verification Code Generation Class * ClassName: ImageCodeGenerator * @Description: ToDo * @Autor lihaoyang * @date mars 2, 2018 * / public class ImageCoderat ValidateCodeGenerator {@autowired private securityProperties securityProperties; @Override public ImageCode Generator (ServletWebRequest Request) {// Lisez d'abord la demande s'il y a des paramètres de longueur, de largeur et de caractères. S'il y en a, utilisez-le et par défaut int width = servleRequestUtils.getIntParameter (request.getRequest (), "width", SecurityProperties.getcode (). GetImage (). GetWidth ()); int height = servletRequestUtils.getIntParameter (request.getRequest (), "Height", SecurityProperties.getcode (). getImage (). Getheight ()); int charngled = this.securityproperties.getcode (). getImage (). getLength (); VerifyCode VerifyCode = new VerifyCode (largeur, hauteur, Charlength); return new ImageCode (VerifyCode.getImage (), VerifyCode.getText (), this.securityProperties.getcode (). getImage (). GetExpireIn ()); } public SecurityProperties getSecurityProperties () {return securityProperties; } public void setSecurityProperties (SecurityProperties SecurityProperties) {this.securityProperties = SecurityProperties; }}ValidateCodeBeanConfig:
package com.imooc.security.core.validate.code; import org.springframework.beans.factory.annotation.autowired; import org.springframework.boot.autoconfigure.condition.condition.condition.condition org.springframework.context.annotation.bean; import org.springframework.context.annotation.configuration; import com.imooc.security.core.properties.securityProperties; / ** * Configurez le bean de la classe d'implémentation réelle du validatecodegenerator * classname: ValidateCodeBanConfig * @vadegenerator * Classname: ValidateCodeBanConfig * @vaDeDeScript * Le bean de la classe d'implémentation réelle du validatecodeGenerator * tel que l'implémentation du code de vérification d'image et l'implémentation du code de vérification SMS * @author lihaoyang * @date le 5 mars 2018 * / @ ConfigurationPublic class ValidateCodeBeanConfig {@Autowired private SecurityPropertiesProperties; / ** * @Description: * @conditionalonMissingBean Annotation signifie que lorsque le conteneur à ressort n'a pas d'imageCodeGenerator, la fonction est de rendre le programme plus extensible. La classe de configuration est configurée dans le module de base. Cela signifie que si le projet qui fait référence au module * a sa propre implémentation, qui implémente l'interface validatecodegenerator et définit sa propre implémentation. Le nom est également appelé ImageCodeGenerator, * est utilisé pour implémenter l'implémentation au niveau de l'application, et s'il n'y a pas une telle implémentation, utilisez cette implémentation par défaut. * @param @return * @return validateCodeGenerator * @Throws * @Author lihaoyang * @Date 5 mars 2018 * / @bean @conditionalonMissingBean (name = "ImageCodeGenerator") public validateCodeGenerator ImageCodeGenerator (); CodeGenerator.SetSecurityProperties (SecurityProperties); return codeGenerator; }}De cette façon, si un module fait référence à ce module de code de vérification, il personnalise l'implémentation, tel que:
package com.imooc.code; import org.springframework.sterreotype.component; import org.springframework.web.context.request.servletwebrequest; import com.imooc.security.core.validate.code.imagecode; import; com.imooc.security.core.validate.code.validatecodeGenerator; @Component ("ImageCodeGenerator") Generator de DemoiMagecodeGenerator (ServletWebrequest Generator (@Override public Imagecode ("Generated Verrification Code pour la mise en œuvre du projet Demo,"); "); retourner null; }}De cette façon, lorsque ValidateCodeBeanConfig configure le bean de code de vérification, il utilisera l'implémentation personnalisée de l'utilisateur.
Le code complet est placé dans GitHub: https://github.com/lhy1234/spring-security
Résumer
Ce qui précède est l'exemple de code de la fonction de code de vérification d'image Spring Security qui vous a été introduit par l'éditeur. J'espère que cela vous sera utile. Si vous avez des questions, veuillez me laisser un message et l'éditeur vous répondra à temps. Merci beaucoup pour votre soutien au site Web Wulin.com!