Este artículo presenta Springboot combinado con SpringSecurity para implementar la función del código de verificación gráfica, y la comparte con usted, como sigue:
Generar código de verificación gráfico
El proceso de generación de códigos de verificación gráficos es relativamente simple y no tiene nada que ver con la seguridad de SpringS. Entonces acabo de publicar el código
Generar imágenes basadas en números aleatorios
/** * Genere el código de verificación gráfico * @param solicitud * @return */private imageCode generate (solicitud de servletwebRequest) {int width = 64; int altura = 32; Bufferedimage imagen = nueva bufferedimage (ancho, altura, bufferedimage.type_int_rgb); Gráficos g = image.getgraphics (); Aleatorio aleatorio = new Random (); G.SetColor (GetRandcolor (200, 250)); G.Fillrect (0, 0, ancho, altura); G.SetFont (New Font ("Times New Roman", Font.italic, 20)); G.SetColor (GetRandcolor (160, 200)); para (int i = 0; i <155; i ++) {int x = random.nextint (ancho); int y = random.nextint (altura); int xl = random.nextint (12); int yl = random.nextint (12); G.Drawline (x, y, x + xl, y + yl); } Cadena srand = ""; for (int i = 0; i <4; i ++) {string rand = string.ValueOf (random.nextInt (10)); srand += rand; G.SetColor (nuevo color (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);}/** * Genere rayas de fondo aleatorias * * @param fc * @param bc * @return */private color getRandcolor (int fc, int bc) {random aleator = 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); devolver nuevo color (r, g, b);}Guardar números aleatorios en la sesión && Escriba la imagen generada en la respuesta de la interfaz
@RestControllerPublic Class ValidateCodeController {public static final String session_key = "session_key_image_code"; Sessionstrategy privado SessionStrategy = new httpSessessionStrategy (); @Getmapping ("/código/imagen") public void createCode (httpservletRequest solicitud, httpservletResponse respuesta) lanza ioexception {imageCode imageCode = generate (nueva servletwebRequest (solicitud)); sessionStrategy.SetAttribute (new ServletWebRequest (solicitud), session_key, imageCode); ImageIO.Write (imageCode.getImage (), "jpeg", respuesta.getOutputStream ()); }}Agregar código de verificación gráfica al proceso de autenticación
En la explicación detallada del proceso de autenticación de la seguridad de SpringS, mencionamos que la seguridad de Springs se verifica a través de la cadena del filtro. Queremos verificar el código de verificación gráfica, para que podamos verificarlo antes del proceso de autenticación, es decir, antes UsernamePasswordAuthenticationFilter .
Filtro de código de verificación gráfico personalizado
@ComponentPublic Class ValidAteCodeFilter se extiende OnceperRequestFilter {private sesionStrategy sesionStrategy = new httpSessesSessionStrategy (); Autenticación privadaFailureHandler AuthenticationFailureHandler; @Override protegido dofilterInternal (httpServletRequest httpServletRequest, httpServletResponse HttpServletResponse, filterChain FilterChain) tira servletException, ioException {if (stringUtils.equals ("/user/login", httpservletRequest.getReSturi () StringUtils.equalSignorecase (httpservletRequest.getMethod (), "post")) {try {// 1. Verifique la verificación del código de verificación (nuevo servletwebRequest (httpservletRequest)); } Catch (ValidAteCodeeException e) {// 2. Si la verificación falla, Call SpringSecurity Fails Processor Processor AuthenticationFailureHandler.AnpeuthenticationFailure (httpservletRequest, httpServletRePonse, e); devolver ; }} // 3. Si se pasa la verificación, libere filtreChain.dofilter (httpservletRequest, httpservletResponse); }}El proceso de verificación del código de verificación aquí es relativamente simple. Determina principalmente si los parámetros aprobados son consistentes con los almacenados en la sesión y si el código de verificación en la sesión ha expirado.
Después de tener nuestro propio filtro de código de verificación, también necesitamos configurarlo antes de la UserNamePassWordAuthenticationFilter:
@OverrideProtected Void Configurar (httpsecurity http) lanza la excepción {validateCodeFilter ValidAteCodeFilter = new ValidAteCodeFilter (); ValidateCodeFilter.SetAuthenticationFailureHandler (myauthenticationFailureHandler); // Configure nuestros filtros personalizados en UserNamePassWalDauthenticationFilter antes de http.addfilterbefore (validateCodeFilter, usernamePasswordAuthenticationFilter.class) .Formlogin () // Defina la página de inicio de sesión a la cual el usuario necesita iniciar sesión. // La configuración posterior se omite}Descarga de código
Seguridad en la primavera
Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.