SpringSecurity添加图形验证码认证实现
更新时间:2022年08月15日 11:14:41 作者:卑微小钟
本文主要介绍了SpringSecurity添加图形验证码认证实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
第一步:图形验证码接口
1.使用第三方的验证码生成工具Kaptcha
https://github.com/penggle/kaptcha
@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.设置验证接口
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.模板表单设置
<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.过滤器
@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); } }
异常类
public class ValidateCodeException extends AuthenticationException { public ValidateCodeException(String msg) { super(msg); } }
注意:一定是继承AuthenticationException
第三步:将图像验证过滤器添加到springsecurity过滤器链中
1.添加到过滤器链中,并设置在用户认证过滤器(UsernamePasswordAuthenticationFilter)前
@Resource private ImageCodeValidateFilter imageCodeValidateFilter; @Override protected void configure(HttpSecurity http) throws Exception { // 前后代码略 // 添加图形验证码过滤器链 http.addFilterBefore(imageCodeValidateFilter, UsernamePasswordAuthenticationFilter.class) }
2.一定不要忘记放行验证码接口
// 拦截设置 http .authorizeHttpRequests() //排除/login .antMatchers("/login","/code/image").permitAll();
到此这篇关于SpringSecurity添加图形验证码认证实现的文章就介绍到这了,更多相关SpringSecurity 图形验证码认证内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
java模拟ajax访问另一个项目的controller代码实例
今天小编就为大家分享一篇关于java模拟ajax访问另一个项目的controller代码实例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧2019-03-03三道java新手入门面试题,通往自由的道路--锁+Volatile
这篇文章主要为大家分享了最有价值的3道多线程面试题,涵盖内容全面,包括数据结构和算法相关的题目、经典面试编程题等,对hashCode方法的设计、垃圾收集的堆和代进行剖析,感兴趣的小伙伴们可以参考一下2021-07-07
最新评论