Este artigo apresenta o Springboot combinado com a SpringSecurity para implementar a função de código de verificação gráfica e compartilha com você, como segue:
Gerar código de verificação gráfica
O processo de geração de códigos de verificação gráfica é relativamente simples e não tem nada a ver com a SpringSecurity. Então eu acabei de postar o código
Gerar imagens baseadas em números aleatórios
/** * Gere código de verificação gráfica * @param request * @return */private imageCode Gereate (servletwebrequest request) {int width = 64; int altura = 32; Imagem bufferedImage = new bufferImage (largura, altura, bufferImage.type_int_rgb); Gráficos g = image.getGraphics (); Aleatório aleatório = novo aleatório (); G.SetColor (Getrandcolor (200, 250)); G.FillRect (0, 0, largura, altura); G.SetFont (New Font ("Times New Roman", Font.italic, 20)); g.setColor (getrandcolor (160, 200)); for (int i = 0; i <155; i ++) {int x = aleatom.nextInt (largura); int y = random.nextint (altura); int xl = random.nextint (12); int yl = random.nextint (12); G.Drawline (x, y, x + xl, y + yl); } String srand = ""; for (int i = 0; i <4; i ++) {string rand = string.valueof (aleatoriamente.nextInt (10)); srand += rand; g.setColor (nova cor (20 + Random.NextInt (110), 20 + Random.NextInt (110), 20 + Random.Nextint (110))); G.DrawString (Rand, 13 * i + 6, 16); } g.dispose (); Retornar novo ImageCode (Image, Srand, 60);}/** * Gere listras aleatórias de fundo * * @param fc * @param bc * @return */color privado getRandcolor (int fc, int bc) {aleatomia Random = novo Random (); if (fc> 255) {fc = 255; } if (bc> 255) {bc = 255; } int r = fc + aleatoriamente.NextInt (BC - FC); int g = fc + aleatoriamente.nextInt (bc - fc); int b = fc + aleatoriamente.nextInt (bc - fc); Retornar nova cor (R, G, B);}Salve números aleatórios na sessão e escreva a imagem gerada na resposta da interface
@RestControllerPublic Class ValidAtecOdecontroller {public static final string session_key = "session_key_image_code"; sessionstrategy sessionStrategy = novo httpSessionSionSionsStrategy (); @GetMapping ("/code/image") public void createCode (solicitação httpServLeQuest, httpServletResponse resposta) lança IoException {imageCode imageCode = generate (new ServletwebRequest (request)); sessionstrategy.setAttribute (new servletwebrequest (solicitação), session_key, imageCode); Imageio.write (imageCode.getImage (), "jpeg", resposta.getOutputStream ()); }}Adicionar código de verificação gráfica ao processo de autenticação
Na explicação detalhada do processo de autenticação SpringSecurity, mencionamos que o SpringSecurity é verificado através da cadeia de filtro. Queremos verificar o código de verificação gráfica, para que possamos verificá -lo antes do processo de autenticação, ou seja, antes UsernamePasswordAuthenticationFilter .
Filtro de código de verificação gráfica personalizada
@ComPonentPublic Class ValidAcodeFilter se estende uma vez melhorequestFilter {private sessionstrategy sessionstrategy = new httpSessionSionsionStrategy (); AuthenticationFailureHandler privado AuthenticationFailureHandler; @Override protected void doFilterInternal(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, FilterChain filterChain) throws ServletException, IOException { if(StringUtils.equals("/user/login", httpServletRequest.getRequestURI()) && StringUtils.equalsignorecase (httpServletRequest.getMethod (), "post")) {try {// 1. Verificar a verificação do código de verificação (new ServletwebRequest (httpServletRequest)); } catch (validateCodeException e) {// 2. Se a verificação falhar, chama o processador de falha de verificação do SpringSecurity AuthenticationFailureHandler.OnauthenticationFailure (httpServleTrequest, httpsSertLeSponse, e); retornar ; }} // 3. Se a verificação for passada, libere FilterChain.Dofilter (httpServletRequest, httpServletResponse); }}O processo de verificação do código de verificação aqui é relativamente simples. Ele determina principalmente se os parâmetros passados são consistentes com os armazenados na sessão e se o código de verificação na sessão expirou.
Depois de ter nosso próprio filtro de código de verificação, também precisamos configurá -lo antes do Filter UsernamePasswordAthentication:
@OverrideProtected void Configure (httpsecurity http) lança Exceção {validateCodeFilter validateCodeFilter = new ValidAtecodeFilter (); validateCodeFilter.SetAuthenticationFailureHandler (MyAuthenticationFailureHandler); // Configure nossos filtros personalizados para UserNamePasswordAthenticationFilter antes de http.addfilterbe antes (validateCodeFilter, UsernamePasswordAthenticationFilter.class) .FormLogin () // Definir a página de login na qual o usuário precisa de registrar.Download de código
Segurança da primavera
O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.