(三)Spring Security增加验证码验证


我们接着上一章 (二)Spring Security自定义登录成功或失败处理器,进行开发

一:首先声明一个验证码异常

/**
 * 声明一个验证码异常,用于抛出特定的验证码异常
 */
public class VerifyCodeException extends AuthenticationException {
    public VerifyCodeException(String msg) {
        super(msg);
    }
}

二:创建一个验证码过滤器

@Component
public class VerifyCodeFilter extends OncePerRequestFilter {
    private static final Logger log = LoggerFactory.getLogger(VerifyCodeFilter.class);
    @Autowired
    private LoginFailureHandler loginFailureHandler;
    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
        if(request.getRequestURI().equals("/login")&&request.getMethod().equalsIgnoreCase("post")){
            try {
                validate(request);
            } catch (VerifyCodeException e) {
                loginFailureHandler.onAuthenticationFailure(request,response,e);
                return;
            }
        }
        // 3. 校验通过,就放行
        filterChain.doFilter(request, response);
    }
    /* 验证保存在session的验证码和表单提交的验证码是否一致 */
    private void validate(HttpServletRequest request) throws ServletRequestBindingException {
        String captcha = ServletRequestUtils.getStringParameter(request, "captcha");
        String code = (String) request.getSession().getAttribute(request.getParameter("uuid"));
        log.info("获取提交的code",captcha);
        log.info("获取保存的code",code);
        if(!code.equalsIgnoreCase(captcha)){
            throw new VerifyCodeException("验证码不正确!");
        }
        request.getSession().removeAttribute(request.getParameter("uuid"));
    }
}

三:在WebSecurityConfig中添加过滤器

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
            .authorizeRequests() /* 需要授权的请求 */
            .antMatchers("/login","/home").permitAll() /* 过滤不需要认证的路径 */
            .anyRequest().authenticated() /* 对任何一个请求,都需要认证 */
            .and() /* 完成上一个配置,进行下一步配置 */
            //.httpBasic();
            .formLogin() /* 配置表单登录 */
            .loginPage("/login") /* 设置登录页面 */
            .successHandler(successHandler)  /* 设置成功处理器 */
            .failureHandler(failureHandler)  /* 设置失败处理器*/
            .and()
            .logout() /* 登出 */
            .logoutSuccessUrl("/home"); /* 设置退出页面 */
    /* 添加验证码过滤器 */        
    http.addFilterBefore(verifyCodeFilter, UsernamePasswordAuthenticationFilter.class);
    }

四:controller输出验证码到页面

@RestController
public class MainController {
    @GetMapping(value = "/123")
    public Object login(){
        return "hello world";
    }
    @GetMapping("/getCode")
    public Object getCode(HttpServletRequest request) {
        /* 生成验证码字符串 */
        String verifyCode = VerifyCodeUtil.generateVerifyCode(4);
        String uuid = UUIDUtil.GeneratorUUIDOfSimple();
        HttpSession session = request.getSession();
        session.setAttribute(uuid,verifyCode);
        int w = 111,h = 36;
        try (ByteArrayOutputStream stream = new ByteArrayOutputStream()) {
            VerifyCodeUtil.outputImage(w, h, stream, verifyCode);
            return new BaseResult(ReturnCode.SUCCESS.getCode(), ReturnCode.SUCCESS.getMessage(),new ImgVO("data:image/gif;base64,"+ Base64Utils.encodeToString(stream.toByteArray()),uuid));
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
}

五:前端接收

在这里插入图片描述
示例:
在这里插入图片描述

六:项目地址

Spring Security增加验证码验证

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Spring Security中的图片验证码是一种安全机制,用于在用户登录时验证用户的身份。它是通过将验证码作为一个过滤器添加到Spring Security的过滤器链中来实现的。在实现图片验证码时,可以使用第方库,如kaptcha。 具体来说,可以有两种实现方案:基于过滤器和基于认证器。基于过滤器的实现方案是将验证码作为一个过滤器添加到Spring Security的过滤器链中,放在登录过滤器之前。这样,在用户提交登录请求时,验证码过滤器会先校验用户输入的验证码是否正确,如果验证码不正确,则拒绝用户登录。这种方案需要自定义一个异常类来响应验证码的校验结果。 另一种实现方案是基于认证器的方式,它是通过扩展Spring Security的认证器来实现的。在自定义的认证器中,可以添加验证码校验的逻辑,当用户提交登录请求时,认证器会先校验用户输入的验证码是否正确,再校验用户名和密码是否正确。如果验证码不正确,则拒绝用户登录。这种方案比较灵活,可以根据实际需求进行自定义。 总的来说,Spring Security中的图片验证码是一种用于保护登录页面免受恶意攻击的安全机制,通过添加验证码过滤器或自定义认证器来实现,可以有效防止恶意用户的登录行为。<span class="em">1</span><span class="em">2</span><span class="em">3</span><span class="em">4</span>

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值