Springboot +spring security,自定义认证器实现验证码功能

news2024/10/7 6:40:50

一.简介

SpringSecurity 默认是不支持验证码功能的,但是可以自己扩展,这也是使用SpringSecurity的好处之一,原生不支持,我们就自己扩展。

二.思路分析

因为系统默认的有一个DaoAuthenticationProvider 认证处理器,但是他只支持用户名和密码方式登录,所以是不能使用现有的认证器,那我们是不是可以实现一个自己的认证器,来覆盖这个默认的认证器呢?答案当然是可以的,大概实现思路是这样的:

  1. 创建一个认证器 继承默认的密码认证器DaoAuthenticationProvider
  2. 定义验证码认证器的逻辑
    2.1. 从session获取保存的验证码
    2.2. 从请求参数中获取用户输入的验证码
    2.3. 比对验证码
    2.4. 如果匹配成功,则调用DaoAuthenticationProvider的authenticate方法,进行原先逻辑认证
    2.5. 如果匹配失败,则抛出异常,不走后面的逻辑
  3. 将自定义的provider加到AuthenticationManager中

这篇文章来看下如何通过自定义认证器来实现验证码校验的功能。

三.创建项目

如何创建一个SpringSecurity项目,前面文章已经有说明了,这里就不重复写了。

四.代码实现

4.1创建验证码处理器

4.1.1引入依赖

验证码的依赖:

com.github.penggle:kaptcha:2.3.2

4.1.2配置验证码

配置验证码的代码如下:

@Bean
    public Producer producer() {
        Properties properties = new Properties();
        properties.setProperty("kaptcha.image.width", "150");
        properties.setProperty("kaptcha.image.height", "50");
        properties.setProperty("kaptcha.textproducer.char.string", "012");
        properties.setProperty("kaptcha.textproducer.char.length", "4");
        Config config = new Config(properties);
        DefaultKaptcha defaultKaptcha = new DefaultKaptcha();
        defaultKaptcha.setConfig(config);
        return defaultKaptcha;
    }

4.1.3创建验证码入口

创建验证码入口的代码如下:

@Autowired(required = false)
    private Producer producer;
    @RequestMapping("/kaptcha")
    public void kaptcha(HttpServletResponse response, HttpSession session){
        response.setContentType("image/jpg");
        String text = producer.createText();
        session.setAttribute("KAPTCHA_CODE",text);
        BufferedImage image = producer.createImage(text);
        try(ServletOutputStream outputStream = response.getOutputStream()){
            ImageIO.write(image,"jpg",outputStream);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

4.2自定义验证码认证处理器

自定义验证码认证处理器代码如下:

public class KaptchaAuthenticationProvider extends DaoAuthenticationProvider {
    @Override
    public Authentication authenticate(Authentication authentication) throws AuthenticationException {
        HttpServletRequest request = ((ServletRequestAttributes) Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest();
        String kaptchaCode = (String) request.getSession().getAttribute("KAPTCHA_CODE");
        String inputKaptcha = request.getParameter("kaptcha");
        if (!StrUtil.equals(kaptchaCode, inputKaptcha)) {
            throw new InternalAuthenticationServiceException("验证码验证失败");
        }
        return super.authenticate(authentication);
    }
}

4.3自定义登录页面

自定义登录页面的前端代码如下:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<div th:text="${SPRING_SECURITY_LAST_EXCEPTION}"></div>
<form action="/login" method="post">
    用户名:<input name="username" type="text"><br>
    密码:<input name="password" type="password"><br>
    验证码:<input name="kaptcha" type="text"><br>
    <img src="/kaptcha">
    <button type="submit">登陆</button>
</form>
</body>
</html>

4.4配置SecurityFilterchain

配置SecurityFilterchain的代码如下:

@Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http.authorizeHttpRequests((auth) ->{
            try {
                auth.antMatchers("/kaptcha").permitAll()
                        .anyRequest().authenticated()
                        .and().formLogin()
                        .loginPage("/login.html")
                        .loginProcessingUrl("/login")
                        .failureForwardUrl("/login.html")
                        .permitAll()
                        .and()
                        .csrf().disable();
            }
            catch (Exception e){
            }
        });
        return http.build();
    }

4.5配置AuthenticationManager

配置AuthenticationManager的代码如下:

@Bean
    public UserDetailsService userDetailsService(){
        UserDetails userDetails = User.withUsername("memory1").password("{noop}memory1").roles("memory1").build();
        return new InMemoryUserDetailsManager(userDetails);
    }

    @Bean
    public KaptchaAuthenticationProvider kaptchaAuthenticationProvider(){
        KaptchaAuthenticationProvider kaptchaAuthenticationProvider= new KaptchaAuthenticationProvider();
        kaptchaAuthenticationProvider.setUserDetailsService(userDetailsService());
        return kaptchaAuthenticationProvider;
    }

    @Bean
    public AuthenticationManager authenticationManager(){
        return new ProviderManager(kaptchaAuthenticationProvider());
    }

五.验证登录

截图如下:
在这里插入图片描述
在这里插入图片描述
至此,扩展验证码功能就处理好了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/554360.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

springboot+java高校学生学分置换系统安全开发

本选题具有以下5个方面的意义&#xff1a; &#xff08;1&#xff09;减少人工的繁琐宣传组织统计时间&#xff0c;提高工作效率和工作精确度以扩大比赛的规模[4]。 &#xff08;2&#xff09;将人工阶段难以实现的公开、公正、公平&#xff0c;通过多方监督的方法进行解决。 &…

美陆军面向战场物联网的边缘智能发展综述

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和…

UVC调用过程部分细节分析

UVC调用过程部分细节分析 文章目录 UVC调用过程部分细节分析概括分析UVC驱动调用过程1.open:ioctl 2.VIDIOC_QUERYCAP3.VIDIOC_ENUM_FMT4.VIDIOC_G_FMT5.VIDIOC_TRY_FMT6.VIDIOC_S_FMT /7.VIDIOC_REQBUFS8.VIDIOC_QUERYBUF9.mmap10.VIDIOC_QBUF11.VIDIOC_STREAMON12.poll13.VID…

基于Java+SpringBoot+vue+element实现校园疫情防控系统详细设计和实现

基于JavaSpringBootvueelement实现校园疫情防控系统详细设计和实现 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末获取源…

好用又便宜的平替苹果笔有哪些?平价的平板触控笔推荐

苹果的Pencil在最近一直都受到市场的追捧&#xff0c;而苹果原装的那款电容笔&#xff0c;除了性能好&#xff0c;还有就是价格贵了点。当然&#xff0c;你也可以使用这款Apple Pencil&#xff0c;但是&#xff0c;如果你不愿意花费太多的钱&#xff0c;可以选择一个平替的电容…

低功耗红外测距感应模块 引领皂液机的革新应用方案WTU201F2 B004

作为现代社会卫生意识的提升&#xff0c;智能洗手设备在公共场所的普及变得越来越重要。为了满足市场需求&#xff0c;唯创知音推出了全新的WTU201F2 B004红外测距模块&#xff0c;作为皂液机红外感应模块&#xff0c;凭借其低功耗和小体积的特点&#xff0c;这款模组将成为开发…

本地电脑部署微力同步私人网盘,端口映射实现远程访问

✨个人主页&#xff1a;bit me&#x1f447; 目 录 &#x1f43e;1.前言&#x1f490;2. 微力同步网站搭建&#x1f338;2.1 微力同步下载和安装&#x1f337;2.2 微力同步网页测试&#x1f340;2.3 cpolar的安装和注册 &#x1f339;3.本地网页发布&#x1f33b;3.1 Cpolar云端…

新增Video-Worker组件,支持会话录像自动转MP4格式,JumpServer堡垒机v3.3.0发布

2023年5月22日&#xff0c;JumpServer开源堡垒机正式发布v3.3.0版本。在这一版本中&#xff0c;资产连接令牌支持在有效期内不限次数地复用&#xff1b;用户登录方式&#xff08;包含钉钉、飞书、企业微信扫码登录&#xff09;支持当不存在的用户扫码登录后&#xff0c;自动创建…

【C++】函数提高

欢迎来到博主 Apeiron 的博客&#xff0c;祝您旅程愉快 &#xff01;时止则止&#xff0c;时行则行。动静不失其时&#xff0c;其道光明。 目录 1、缘起 2、函数默认参数 3、函数占位参数 4、总结 1、缘起 以前学习过了函数的基本用法和功能&#xff0c;现在是时候学习函数…

Android应用程序架构分析和基本语法

文章目录 一、控制层与表现层二、Android程序的组成结构三、Android语法基础数据类型与转换转义字符类与对象接口 一、控制层与表现层 在Android应用程序中&#xff0c;逻辑控制层与表现层是分开的设计的。逻辑控制层由Java应用程序实现&#xff0c;表现层由XML文档描述&#…

深入探索 Cilium 的工作机制

这篇之前写 Kubernetes 网络学习之 Cilium 与 eBPF 记录的内容&#xff0c;隔了几个月终于想起把笔记完成&#xff0c;作为探索 Cilium 工作原理的入门&#xff0c;也还是 Cilium 冰山一角&#xff0c;像是高级的网络策略、网络加密、BGP 网络、服务网格等方面并没有深入。如果…

Python实现ACO蚁群优化算法优化BP神经网络回归模型(BP神经网络回归算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 蚁群优化算法(Ant Colony Optimization, ACO)是一种源于大自然生物世界的新的仿生进化算法&#xff0c…

tuple基本用法

元组简介 C11 标准新引入了一种类模板&#xff0c;命名为 tuple&#xff08;中文可直译为元组&#xff09;。tuple 最大的特点是&#xff1a;实例化的对象可以存储任意数量、任意类型的数据。 tuple 的应用场景很广泛&#xff0c;例如当需要存储多个不同类型的元素时&#xf…

Spring Boot 是什么?与传统的 Spring 框架有何不同?

Spring Boot是一个基于Spring框架的快速开发框架&#xff0c;它使用了约定大于配置的方式&#xff0c;可以帮助开发人员快速搭建基于Spring的Web应用程序。相较于传统的Spring框架&#xff0c;Spring Boot的优势在于自动化配置、嵌入式Web容器、依赖管理等方面。本文将详细介绍…

【活动预告】数据集成引擎BitSail遇上CDC

BitSail是字节跳动开源数据集成引擎&#xff0c;于2022年10月26日宣布开源&#xff0c;可支持多种异构数据源间的数据同步&#xff0c;并提供离线、实时、全量、增量场景下全域数据集成解决方案。BitSail支撑了字节内部众多的业务线&#xff0c;支持多种数据源之间的批式/流式/…

码上行动:零基础学会Python编程

前言&#xff1a; Hello大家好&#xff0c;我是Dream。 欢迎来到 Crossin的编程教室 &#xff01;Crossin的新书《码上行动&#xff1a;零基础学会Python编程》终于和大家见面啦&#xff01; 本书力求做到浅显易懂&#xff0c;让完全没有编程经验的零基础“小白”也能学会Pytho…

【网络】IP地址和静态路由

目录 &#x1f341;IP地址的格式 子网掩码 &#x1f341;路由器基本原理与配置 配置IP地址通信 &#x1f341;ARP协议和ICMP协议 &#x1f9e7;广播和广播域的概念 &#x1f9e7;ARP协议 &#x1f9e7;ICMP协议 &#x1f341;静态路由和默认路由 &#x1f9e7;路由原理 &#x…

【Python】判断语句 ① ( if 语句 | if 语句语法 | 代码示例 )

文章目录 一、if 语句语法二、代码示例1、代码示例 - 触发 if 语句2、代码示例 - 不触发 if 语句 一、if 语句语法 在 Python 中 , 使用 if 语句进行判断 , 语法格式如下 : if 判断条件,布尔类型变量或表达式:条件成立,布尔类型变量或表达式为 True 执行的代码判断条件没有括号…

Ansys Speos 2023 R1新功能 | Texture可视化纹理提升视觉感知

Ansys Speos 2023 R1 新功能介绍 Ansys Speos 持续推动创新&#xff0c;为光学设计人员提供精确、高性能的仿真功能。2023 R1 新版本提供强大的功能&#xff0c;可加快结果生成速度、提高仿真精度并扩展与其他 Ansys 产品的互操作性。 更新Texture映射预览&#xff0c;为textur…

如何区别BI、大数据、信息化和数字化转型

商业智能BI可以实现业务流程和业务数据的规范化、流程化、标准化&#xff0c;打通ERP、OA、CRM等不同业务信息系统&#xff0c;整合归纳企业数据&#xff0c;利用数据可视化满足企业不同人群对数据查询、分析和探索的需求&#xff0c;从而为管理和业务提供数据依据和决策支持。…