In diesem Artikel wird Springboot in Kombination mit SpringSecurity eingeführt, um die Funktion der grafischen Verifizierungscode zu implementieren, und teilt ihn wie folgt mit Ihnen mit:
Generieren Sie Grafikverifizierungscode
Der Prozess der Erzeugung von Grafikprüfungscodes ist relativ einfach und hat nichts mit Springsicherheit zu tun. Also habe ich gerade den Code gepostet
Generieren Sie Bilder basierend auf Zufallszahlen
/** * Grafikverifizierungscode generieren * @param request * @return */private imageCode generate (ServletWebRequest -Anforderung) {int width = 64; int Höhe = 32; Bufferedimage image = new bufferedImage (width, Höhe, bufferedimage.type_int_rgb); Grafik g = image.getGraphics (); Random random = new random (); G.SetColor (getrandcolor (200, 250)); G.FillRect (0, 0, Breite, Höhe); G.Setfont (neue Schriftart ("Times New Roman", Font.Italic, 20)); G.SetColor (getrandcolor (160, 200)); für (int i = 0; i <155; i ++) {int x = random.nextint (width); int y = random.nextint (Höhe); int xl = random.nextint (12); int yl = random.nextint (12); g.drawline (x, y, x + xl, y + yl); } String srand = ""; für (int i = 0; i <4; i ++) {string rand = string.valueof (random.nextint (10)); srand += rand; G.SetColor (neue Farbe (20 + random.Nextint (110), 20 + random.Nextint (110), 20 + random.Nextint (110))); G.Drawstring (Rand, 13 * i + 6, 16); } g.disponse (); RETUCT NEW ImageCode (Bild, Srand, 60);}/** * Generieren Sie zufällige Hintergrundstreifen * * @param fc * @param bc * @return */private color getrandcolor (int fc, int bc) {randal 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); Neue Farbe zurückgeben (r, g, b);}Speichern Sie zufällige Zahlen in Sitzung und schreiben Sie das generierte Bild in die Schnittstellenantwort
@RestControllerPublic Class validateCodeController {public static Final String Session_Key = "Session_key_image_code"; Private SessionsStrategy SessionSsionStrategy = new httpSessionSsionSsionStrategy (); @Getmapping ("/code/image") public void createCode (httpServletRequest -Anforderung, httpServletResponse -Antwort) löst IOException {imageCode imageCode = generate (neuer servletWebRequest (Anfrage)) aus; SESSIsionStrategy.SetAttribute (neuer ServletWebRequest (Anfrage), Session_key, ImagleCode); Imageio.write (imageCode.getImage (), "jpeg", response.getOutputStream ()); }}Fügen Sie dem Authentifizierungsprozess Grafikverifizierungscode hinzu
In der detaillierten Erläuterung des Authentifizierungsprozesses in Springsicherheit erwähnten wir, dass Springsicherheit durch die Filterkette verifiziert wird. Wir möchten den grafischen Verifizierungscode überprüfen, damit wir ihn vor dem Authentifizierungsprozess überprüfen können, dh vor UsernamePasswordAuthenticationFilter .
Benutzerdefinierte Grafikverifizierungscodefilter
@ComponentPublic Class ValidateCodeFilter erweitert sich einmal vonPerRequestFilter {private SessionSsionStrategy SessionSsionStrategy = new httpSessionSsionSsionStrategy (); Private AuthenticationFailureHandler AuthenticationFailureHandler; @Override Protected void dofilterinternal (httpServletRequest httpServletRequest, httpServletResponse httpServletResponse, filterchain filterchain) löscht ServletException, IoException {ifutils.Aläxen ("/user/logge", HttpServevletrequest. & sub. Stringutils.equalSignoreCase (httpServletRequest.getMethod (), "post")) {try {// 1. Überprüfende Überprüfung des Verifizierungscodes (neuer servletWebRequest (httpServletRequest)); } catch (validateCodeexception e) {// 2. Wenn die Überprüfung fehlschlägt, rufen Sie die Verifizierungsfehlerprozessor -Authentifizierung von SpringSecurity auf. zurückkehren ; }} // 3. Wenn die Überprüfung übergeben wird, freisetze filterchain.dofilter (httpServletRequest, httpServletResponse); }}Der Verifizierungscode -Überprüfungsprozess ist hier relativ einfach. Es wird hauptsächlich bestimmt, ob die bestandenen Parameter mit den gespeicherten in der Sitzung übereinstimmen und ob der Verifizierungscode in der Sitzung abgelaufen ist.
Nachdem wir unseren eigenen Verifizierungscode -Filter haben, müssen wir ihn auch vor der Bekenntnisbezeichnung konfigurieren:
@OverrideProtected void configure (httpecurity http) löst Ausnahme aus {validateCodeFilter validateCodeFilter = new validateCodeFilter (); validatecodeFilter.setAuthenticationFailureHandler (MyAuthenticationFailureHandler); // Konfigurieren Sie unsere benutzerdefinierten Filter mit usernamePasswordAuthenticationFilter vor http.addfilterbeFore (validateCodeFilter, usernamepasswordAuthenticationFilter.class) .Formlogin () // Definieren Sie die Anmeldeseite, an der der Benutzer logCode herunterladen
Frühlingssicherheit
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.