java - springBoot+spring security+Kaptcha如何实现图片验证码

 手机用户2502853217 发布于 2022-10-25 17:53
@Component
public class MyAuthenticationProvider implements AuthenticationProvider {


    @Autowired
    private CustomUserDetailsService userService;
    @Override
    public Authentication authenticate(Authentication authentication) throws AuthenticationException {
        String username = authentication.getName();
        String password = (String) authentication.getCredentials();
        CustomUserDetails user = (CustomUserDetails) userService.loadUserByUsername(username);
        if(user == null){
            throw new BadCredentialsException("用户不存在");
        }

        if (!password.equals(user.getPassword())) {
            throw new BadCredentialsException("错误的密码");
        }

        Collection authorities = user.getAuthorities();
        return new UsernamePasswordAuthenticationToken(user, password, authorities);
    }

    @Override
    public boolean supports(Class arg0) {
        return true;
    }


}

在springBoot项目中有这个类验证用户名和密码。现在想添加图片验证码(Kaptcha)该如何实现???

1 个回答
  • 重写它这个类,为它添加验证码校验就可以;
    这里又一个shiro的添加验证码的方式例子


    public class CaptchaFormAuthenticationFilter extends FormAuthenticationFilter{

    private static final Logger LOG = LoggerFactory.getLogger(CaptchaFormAuthenticationFilter.class);
    private static final String DEFAULT_CAPTCHA_PARAM = "captcha";
    
    private String captchaParam = DEFAULT_CAPTCHA_PARAM;
    
    public String getCaptchaParam() {
        return captchaParam;
    }
    
    public void setCaptchaParam(String captchaParam) {
        this.captchaParam = captchaParam;
    }
    
    protected String getCaptcha(ServletRequest request){
        
        return WebUtils.getCleanParam(request, captchaParam);
    }
    
    public CaptchaFormAuthenticationFilter() {
    }
    
    @Override
    protected boolean executeLogin(ServletRequest request,
            ServletResponse response) throws Exception {
        CaptchaUsernamePasswordToken token = (CaptchaUsernamePasswordToken) createToken(request, response);
        boolean isValidate = doCaptchaValidate((HttpServletRequest) request,token);
        if(isValidate){
            Subject subject = getSubject(request, response);
            subject.login(token);
            return super.executeLogin(request, response);
        }
        return false;
    }
    
    protected boolean doCaptchaValidate(HttpServletRequest request,CaptchaUsernamePasswordToken token){
        String captcha = (String) request.getSession().getAttribute(DEFAULT_CAPTCHA_PARAM);
         if (captcha != null && !captcha.equalsIgnoreCase(token.getCaptcha())) {  
              return false;
          }  
        return true;
    } 
    /**
     * 创建口令
     */
    @Override
    protected AuthenticationToken createToken(ServletRequest request,
            ServletResponse response) {
        String captcha = getCaptcha(request);
        String username = getUsername(request);
        String password = getPassword(request);
        boolean rememberMe = isRememberMe(request);
        String host = getHost(request);
        return new CaptchaUsernamePasswordToken(username, password.toCharArray(), rememberMe, host, captcha) ;
    }

    }

    public class CaptchaUsernamePasswordToken extends UsernamePasswordToken {

    private static final long serialVersionUID = 8446567829844028162L;
    //验证码字符串  
    private String captcha;  
    
    public CaptchaUsernamePasswordToken(String username, char[] password,  
            boolean rememberMe, String host, String captcha) {  
        super(username, password, rememberMe, host);  
        this.captcha = captcha;  
    }  
    
    public String getCaptcha() {  
        return captcha;  
    }  
    
    public void setCaptcha(String captcha) {  
        this.captcha = captcha;  
    }  

    }

    2022-10-26 23:37 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有