前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >springsecurity自定义密码验证_数字图形验证码怎么填

springsecurity自定义密码验证_数字图形验证码怎么填

作者头像
全栈程序员站长
发布2022-09-29 11:23:21
5130
发布2022-09-29 11:23:21
举报
文章被收录于专栏:全栈程序员必看

大家好,又见面了,我是你们的朋友全栈君。

SpringSecurity添加图形验证码认证功能

第一步:图形验证码接口

1.使用第三方的验证码生成工具Kaptcha

https://github.com/penggle/kaptcha

代码语言:javascript
复制
@Configuration
public class KaptchaImageCodeConfig { 

@Bean
public DefaultKaptcha getDefaultKaptcha(){ 

DefaultKaptcha defaultKaptcha = new DefaultKaptcha();
Properties properties = new Properties();
properties.setProperty(Constants.KAPTCHA_BORDER, "yes");
properties.setProperty(Constants.KAPTCHA_BORDER_COLOR, "192,192,192");
properties.setProperty(Constants.KAPTCHA_IMAGE_WIDTH, "110");
properties.setProperty(Constants.KAPTCHA_IMAGE_HEIGHT, "36");
properties.setProperty(Constants.KAPTCHA_TEXTPRODUCER_FONT_COLOR, "blue");
properties.setProperty(Constants.KAPTCHA_TEXTPRODUCER_FONT_SIZE, "28");
properties.setProperty(Constants.KAPTCHA_TEXTPRODUCER_FONT_NAMES, "宋体");
properties.setProperty(Constants.KAPTCHA_TEXTPRODUCER_CHAR_LENGTH, "4");
// 图片效果
properties.setProperty(Constants.KAPTCHA_OBSCURIFICATOR_IMPL,
"com.google.code.kaptcha.impl.ShadowGimpy");
Config config = new Config(properties);
defaultKaptcha.setConfig(config);
return defaultKaptcha;
}
}

2.设置验证接口

代码语言:javascript
复制
Logger logger = LoggerFactory.getLogger(getClass());
public static final String SESSION_KEY = "SESSION_KEY_IMAGE_CODE";
@GetMapping("/code/image")
public void codeImage(HttpServletRequest request, HttpServletResponse response) throws IOException { 

// 获得随机验证码
String code = defaultKaptcha.createText();
logger.info("验证码:{}",code);
// 将验证码存入session
request.getSession().setAttribute(SESSION_KEY,code);
// 绘制验证码
BufferedImage image = defaultKaptcha.createImage(code);
// 输出验证码
ServletOutputStream out = response.getOutputStream();
ImageIO.write(image, "jpg", out);
}

3.模板表单设置

代码语言:javascript
复制
<div class="form-group">
<label>验证码:</label>
<input type="text" class="form-control" placeholder="验证码" name="code">
<img src="/code/image" th:src="@{/code/image}" onclick="this.src='/code/image?'+Math.random()">
</div>

第二步:设置图像验证过滤器

1.过滤器

代码语言:javascript
复制
@Component
public class ImageCodeValidateFilter extends OncePerRequestFilter { 

private MyAuthenticationFailureHandler myAuthenticationFailureHandler;
// 失败处理器
@Resource
public void setMyAuthenticationFailureHandler(MyAuthenticationFailureHandler myAuthenticationFailureHandler) { 

this.myAuthenticationFailureHandler = myAuthenticationFailureHandler;
}
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { 

try { 

if ("/login/form".equals(request.getRequestURI()) &&
request.getMethod().equalsIgnoreCase("post")) { 

// 获取session的验证码
String sessionCode = (String) request.getSession().getAttribute(PageController.SESSION_KEY);
// 获取用户输入的验证码
String inputCode = request.getParameter("code");
// 判断是否正确
if(sessionCode == null||!sessionCode.equals(inputCode)){ 

throw new ValidateCodeException("验证码错误");
}
}
}catch (AuthenticationException e){ 

myAuthenticationFailureHandler.onAuthenticationFailure(request,response,e);
//e.printStackTrace();
return;
}
filterChain.doFilter(request, response);
}
}

异常类

代码语言:javascript
复制
public class ValidateCodeException extends AuthenticationException { 

public ValidateCodeException(String msg) { 

super(msg);
}
}

注意:一定是继承AuthenticationException

第三步:将图像验证过滤器添加到springsecurity过滤器链中

1.添加到过滤器链中,并设置在用户认证过滤器(UsernamePasswordAuthenticationFilter)前

代码语言:javascript
复制
@Resource
private ImageCodeValidateFilter imageCodeValidateFilter;
@Override
protected void configure(HttpSecurity http) throws Exception { 

// 前后代码略
// 添加图形验证码过滤器链
http.addFilterBefore(imageCodeValidateFilter, UsernamePasswordAuthenticationFilter.class)
}

2.一定不要忘记放行验证码接口

代码语言:javascript
复制
// 拦截设置
http
.authorizeHttpRequests()
//排除/login
.antMatchers("/login","/code/image").permitAll();

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/193429.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年9月15日 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • SpringSecurity添加图形验证码认证功能
    • 第一步:图形验证码接口
      • 1.使用第三方的验证码生成工具Kaptcha
      • 2.设置验证接口
      • 3.模板表单设置
    • 第二步:设置图像验证过滤器
      • 1.过滤器
      • 异常类
    • 第三步:将图像验证过滤器添加到springsecurity过滤器链中
      • 1.添加到过滤器链中,并设置在用户认证过滤器(UsernamePasswordAuthenticationFilter)前
    • 2.一定不要忘记放行验证码接口
    相关产品与服务
    验证码
    腾讯云新一代行为验证码(Captcha),基于十道安全栅栏, 为网页、App、小程序开发者打造立体、全面的人机验证。最大程度保护注册登录、活动秒杀、点赞发帖、数据保护等各大场景下业务安全的同时,提供更精细化的用户体验。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档