spring boot security验证码登录示例

news/2024/10/28 21:17:58/

前言

在spring boot security自定义认证一文,基本给出了一个完整的自定义的用户登录认证的示例,但是未涉及到验证的使用,本文介绍登录的时候如何使用验证码。

本文介绍一个验证码生成工具,比较老的一个库了,仅作demo使用,不太建议生产用了,因为如果你的代码需要进行安全扫描,这个库已经不再维护了,如果扫出漏洞,也没法升级修复了。

但是如果没有安全扫描的要求,还是可以用的。
github: https://github.com/penggle/kaptcha

代码示例

引入依赖

		<dependency><groupId>com.github.penggle</groupId><artifactId>kaptcha</artifactId><version>2.3.2</version></dependency>

定义验证码生成器

@Configuration
public class CaptchaConfiguration {@Beanpublic Producer defaultKaptcha() {Properties properties = new Properties();// 还有一些其它属性,可以进行源码自己看相关配置,比较清楚了,根据变量名也能猜出来什么意思了properties.setProperty(Constants.KAPTCHA_IMAGE_WIDTH, "150");properties.setProperty(Constants.KAPTCHA_IMAGE_HEIGHT, "50");properties.setProperty(Constants.KAPTCHA_TEXTPRODUCER_CHAR_STRING, "0123456789abcdefghigklmnopqrstuvwxyz");properties.setProperty(Constants.KAPTCHA_TEXTPRODUCER_CHAR_LENGTH, "4");Config config = new Config(properties);DefaultKaptcha defaultKaptcha = new DefaultKaptcha();defaultKaptcha.setConfig(config);return defaultKaptcha;}
}

示例是作为spring 的bean注册到spring 容器了,当然也可以作为一个单例对象放到一个静态类里。

定义获取验证码及认证接口

这个接口在前面的文章里已经提到过了,这里只是完善验证码的部分.

@RequestMapping("/login")
@RestController
public class LoginController {private final AuthenticationManager authenticationManager;private final Producer producer;public LoginController(AuthenticationManager authenticationManager, Producer producer) {this.authenticationManager = authenticationManager;this.producer = producer;}@PostMapping()public Object login(@RequestBody User user, HttpSession session) {Object captcha = session.getAttribute(Constants.KAPTCHA_SESSION_KEY);if (captcha == null || !captcha.toString().equalsIgnoreCase(user.getCaptcha())) {return "captcha is not correct.";}try {// 使用定义的AuthenticationManager进行认证处理Authentication authenticate = authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(user.getUsername(), user.getPassword()));// 认证通过,设置到当前上下文,如果当前认证过程后续还有处理的逻辑需要的话。这个示例是没有必要了SecurityContextHolder.getContext().setAuthentication(authenticate);return "login success";} catch (Exception e) {return "login failed";}}/*** 获取验证码,需要的话,可以提供一个验证码获取的接口,在上面的login里把验证码传进来进行比对*/@GetMapping("/captcha")public void captcha(HttpServletResponse response, HttpSession session) throws IOException {response.setContentType("image/jpeg");String text = producer.createText();session.setAttribute(Constants.KAPTCHA_SESSION_KEY, text);BufferedImage image = producer.createImage(text);try (ServletOutputStream out = response.getOutputStream()) {ImageIO.write(image, "jpg", out);}}
}

测试

看一下效果,

获取验证码

在这里插入图片描述

登录

在这里插入图片描述


http://www.ppmy.cn/news/700362.html

相关文章

MySQL-SQL全部锁详解(下)

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a; 小刘主页 ♥️努力不一定有回报&#xff0c;但一定会有收获加油&#xff01;一起努力&#xff0c;共赴美好人生&#xff01; ♥️学习两年总结出的运维经验&#xff0c;以及思科模拟器全套网络实验教程。专栏&#xf…

前端搭建名言生成器(内含源码)

目录 前言 名言生成器 页面搭建 功能实现 前言 今天呢我们来给大家展示的&#xff0c;就是一个非常非常简单的名言生成器&#xff0c; 那么它的功能的非常简单&#xff0c;就是我们通过点击按钮&#xff0c;然后可以生成名人名言&#xff0c;然后我们也可以点击按钮将它分享到…

【ARM】-IRQ 和 FIQ 异常中断处理程序的返回

文章目录 处理流程示例代码实现 处理流程 通常处理器执行完当前指令后&#xff0c;查询 IRQ 中断引脚及 FIQ 中断引脚&#xff0c;并且查看系统是否允许 IRQ 中断及 FIQ中断。 如果有中断引脚有效&#xff0c;并且系统允许该中断产生&#xff0c;处理器将产生 IRQ 异常中断或 …

LangChain大型语言模型(LLM)应用开发(三):Chains

LangChain是一个基于大语言模型&#xff08;如ChatGPT&#xff09;用于构建端到端语言模型应用的 Python 框架。它提供了一套工具、组件和接口&#xff0c;可简化创建由大型语言模型 (LLM) 和聊天模型提供支持的应用程序的过程。LangChain 可以轻松管理与语言模型的交互&#x…

途乐证券|股票缩量下跌是什么意思?意味着什么?

投资者在进行股票投资时可能会遇到股票缩量下跌的情况&#xff0c;那么这是什么意思呢&#xff1f;股票缩量下跌意味着什么呢&#xff1f;下面途乐证券为大家准备了相关内容&#xff0c;以供参考。 股票缩量下跌是什么意思&#xff1f; 股票缩量下跌指的是股票的买卖有效成交在…

小米手环断连解决方案

一天24小时有23个半小时处于断连状态&#xff0c;收不到消息通知。崩溃~ 首先应用有一个自启动管理&#xff0c;我觉得我对自启动管理可能有误区&#xff0c; 我以为的自启动时小米运动app自己启动&#xff0c;自己就能运行&#xff0c;好像貌似不是这样。 接下来是华为手机的…

list转换为arrayList

1、区别&#xff1a;list是一个接口&#xff1b;array List是一个类 2、两者都是集合. 为什么要转换呢&#xff1f; 因为ArrayList 类型不安全&#xff0c;效率较低。 List一点安全&#xff0c;效率比ArrayList要高。 list转array list List<string> litt new List&l…

即时通讯系统集成开发

在即将开发或已有的应用系统中可以快速将信贸通即时通讯系统进行集成&#xff0c;统一用户资料&#xff0c;在线状态等&#xff0c;无需直接操作数据库&#xff0c;只需调用已经封装好的相关类函数和接口&#xff0c;即可进行相应的用户以及消息操作&#xff0c;保持业务数据安…