Cet article présente Springboot combiné avec Springsecurity pour implémenter la fonction de code de vérification graphique et le partage avec vous, comme suit:
Générer un code de vérification graphique
Le processus de génération de codes de vérification graphique est relativement simple et n'a rien à voir avec Springsecurity. Alors je viens de publier le code
Générer des images basées sur des nombres aléatoires
/ ** * Générer le code de vérification graphique * @param request * @return * / private imagecode generate (servletwebRequest request) {int width = 64; int hauteur = 32; BufferedImage Image = new BufferedImage (largeur, hauteur, bufferedImage.type_int_rgb); Graphiques g = image.getGraphics (); Aléatoire aléatoire = nouveau aléatoire (); g.setColor (getrandcolor (200, 250)); G.Fillrect (0, 0, largeur, hauteur); G.Setfont (Nouvelle Font ("Times New Roman", Font.Italic, 20)); g.setColor (getrandcolor (160, 200)); pour (int i = 0; i <155; i ++) {int x = random.nextint (largeur); int y = random.nextint (hauteur); int xl = random.nextint (12); int yl = random.nextint (12); G.Drawline (x, y, x + xl, y + yl); } String srand = ""; pour (int i = 0; i <4; i ++) {String rand rand = string.valueof (random.nextint (10)); srand + = rand; g.setColor (nouvelle couleur (20 + random.nextint (110), 20 + random.nextint (110), 20 + random.nextint (110))); G.Drawstring (Rand, 13 * i + 6, 16); } g.dispose (); return new ImageCode (image, srand, 60);} / ** * générer des bandes d'arrière-plan aléatoires * * @param fc * @param bc * @return * / private Color getrandColor (int fc, int bc) {random random = new random (); if (fc> 255) {fc = 255; } if (bc> 255) {bc = 255; } int r = fc + random.nextint (bc - fc); int g = fc + random.nextint (bc - fc); int b = fc + random.nextint (bc - fc); retourner une nouvelle couleur (R, G, B);}Enregistrer les nombres aléatoires en session et écrivez l'image générée à la réponse de l'interface
@RestControllerPublic Class validateCodeController {public static final String Session_Key = "Session_key_image_code"; SessionStrategy SessionStrategy = new HttpSessionsSisionsTrategy (); @GetMapping ("/ Code / Image") public void createCode (HttpServLetRequest Request, httpServletResponse réponse) lève ioException {ImageCode ImageCode = generate (new ServletWeBrequest (request)); SessionStrategy.SetAttribute (new ServletWebRequest (demande), Session_Key, ImageCode); ImageIo.Write (ImageCode.getImage (), "JPEG", Response.getOutputStream ()); }}Ajouter un code de vérification graphique au processus d'authentification
Dans l'explication détaillée du processus d'authentification de Springsecurity, nous avons mentionné que Springsecurity est vérifiée par la chaîne de filtre. Nous voulons vérifier le code de vérification graphique, afin que nous puissions le vérifier avant le processus d'authentification, c'est-à-dire avant que UsernamePasswordAuthenticationFilter .
Filtre de code de vérification graphique personnalisé
@ComponentPublic Class ValidateCodeFilter étend une foisPerRequestFilter {private SessionStrategy SessionStrategy = new HttpSessionsSisionsTrategy (); Private AuthenticationFailureHandler AuthenticationFailureHandler; @Override Protected void dofilterinternal (httpservletRequest httpservletRequest, httpservletResponse httpservletResponse, filterchain filterChain) lance le servletException, ioexception {if (stringUtils.equals ("/ user", httpservilte StringUtils.EqualsIgnoreCase (httpServletRequest.getMethod (), "Post")) {try {// 1. Vérifier la vérification du code de vérification (nouveau servletWeBRequest (httpservletRequest)); } catch (validateCodeException e) {// 2. Si la vérification échoue, appelez le processeur de vérification de SpringSecurity, authentificationfailurehandler.onauthenticationfailure (httpsservletRequest, httpservletResponse, e); retour ; }} // 3. Si la vérification est passée, relâchez FilterChain.Dofilter (httpServletRequest, httpservletResponse); }}Le processus de vérification du code de vérification ici est relativement simple. Il détermine principalement si les paramètres adoptés sont cohérents avec ceux stockés dans la session et si le code de vérification de la session a expiré.
Après avoir eu notre propre filtre de code de vérification, nous devons également le configurer avant UsernamePasswordAuthenticationFilter:
@OverRideProtected void Configure (httpSecurity http) lève l'exception {validateCodeFilter validateCodeFilter = new validateCodeFilter (); validateCodeFilter.setAuthenticationFailureHandler (myAuthenticationFailureHandler); // Configurez nos filtres personnalisés sur userNamepasswordAuthenticationFilter avant http.addfilterBefore (validatecodeFilter, usernamepasswordAuthenticationFilter.class) .formlogin () // Définir la page de connexion à laquelle l'utilisateur doit se connecter. // La configuration sous-réponse est omise}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.