SpringSecurity添加图形验证码认证实现
作者:卑微小钟 发布时间:2023-07-08 01:37:52
标签: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();
来源:https://blog.csdn.net/zhongjianboy/article/details/123942771


猜你喜欢
- 前言我们开始 Flutter 动画相关篇章之旅,在应用中通过动效能够给用户带来更愉悦的体验,比较典型的例子就是一些直播平台的动效了,比如送火
- 在游戏开发中,主角需要通过跑地图来通关升级,本章主要介绍主角的移动和摄像跟随的操作。主角移动角色位移通过主角的骨骼动画控制(后续文章会详细介
- 本文实例为大家分享了C#导出Excel的具体代码,供大家参考,具体内容如下using System;using System.Collect
- 前言最常用的对字符串操作的类有三个,分别是String,StringBuilder,StringBuffer,下面将会详细的说说这三个类..
- 本文实例为大家分享了Android调用外置摄像头的具体代码,供大家参考,具体内容如下1、布局文件<?xml version="
- Spring Boot 2.7.6整合redis与低版本的区别最近在写程序的时候参考了之前写过的一篇文章spring boot整合redis
- 一、先上效果图借用某东App的效果,如下。折叠时的效果:展开时的效果:二、ChipGroup和ChipchipGroup和chip之前写过博
- 很多学习Android程序设计的人都会发现每个人对代码的写法都有不同的偏好,比较明显的就是对控件响应事件的写法的不同。因此本文就把这些写法总
- 目录Web服务器技术讲解PHP:JSP/ServletWeb服务器IISTomcatJAVA jdk中的内容TomcatTomcat根目录下
- 问题描述Flutter 应用在 Android 端上启动时会有一段很明显的白屏现象,白屏的时长由设备的性能决定,设备性能越差,白屏时间越长。
- Pre本篇博文我们开始梳理下Spring 提供的测试解决方案。对于 Web 应用程序而言, 一个应用程序中涉及数据层、服务层、Web 层,以
- 本文实例为大家分享了Java实现简单万年历的具体代码,供大家参考,具体内容如下1 要求1、输入年份;2、输入月份;3、输出某年某月的日历。2
- 最近在研究JSON,Java中有很多处理JSON的类库,lib-json、sf-json、fastjson还有Jackson Json。第一
- 需求:之前项目一个变动,需要对3张mysql数据库表数据进行清洗,3张表表名不同,表结构完全相同,需要对这3张表进行相同的增、改、查动作,一
- 类加载器类加载器作用负责将.class文件(存储的物理文件)加载到内存中类加载器过程加载:通过全类名获取这个类准备用流传输,加载进内存,加载
- 最大堆最大堆的特点是父元素比子元素大,并且是一棵完全二叉树。data[1]开始存,data[0]空着不用。也可以把data[0]当成size
- 实现多表联合查询还是在david.mybatis.model包下面新建一个Website类,用来持久化数据之用,重写下相应toString(
- 目录前言一、Android应用DAC沙盒二、Android应用权限三、应用信息的存储四、应用权限的映射五、应用的SELinux标签六、And
- 绑定(Binding)元素介绍首先,盗用张图。这图形象的说明了Binding的机理。此处主要介绍的绑定类是System.Windows.Da
- 这篇文章主要介绍了springboot多租户设计过程图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的