SpringSecurity自定义认证

Step 1: 创建自定义UserDetails类
自定义一个实现UserDetails接口的类,用于表示用户信息。您可以在这个类中添加自己需要的属性和方法来存储用户信息。

public class CustomUserDetails implements UserDetails {private String email;private boolean enabled;private List<GrantedAuthority> authorities;public CustomUserDetails(String email, boolean enabled, List<GrantedAuthority> authorities) {this.email = email;this.enabled = enabled;this.authorities = authorities;}// Implement other UserDetails methods...@Overridepublic String getUsername() {return email;}// Getters and setters...
}

Step 2: 创建自定义过滤器
创建一个自定义的过滤器,用于处理邮箱验证码登录逻辑。这个过滤器将在用户登录时验证邮箱和验证码,并完成用户认证过程。

public class EmailVerificationAuthenticationFilter extends AbstractAuthenticationProcessingFilter {public EmailVerificationAuthenticationFilter() {super(new AntPathRequestMatcher("/login/email", "POST"));}@Overridepublic Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response)throws AuthenticationException {String email = obtainEmail(request);String verificationCode = obtainVerificationCode(request);email = (email != null) ? email.trim() : "";verificationCode = (verificationCode != null) ? verificationCode.trim() : "";EmailVerificationToken authRequest = new EmailVerificationToken(email, verificationCode);return this.getAuthenticationManager().authenticate(authRequest);}private String obtainEmail(HttpServletRequest request) {return request.getParameter("email");}private String obtainVerificationCode(HttpServletRequest request) {return request.getParameter("verificationCode");}
}

Step 3: 创建自定义认证令牌
创建一个自定义的认证令牌,继承自UsernamePasswordAuthenticationToken,用于封装用户的邮箱和验证码信息。

public class EmailVerificationToken extends UsernamePasswordAuthenticationToken {private final String email;private final String verificationCode;public EmailVerificationToken(String email, String verificationCode) {super(email, verificationCode);this.email = email;this.verificationCode = verificationCode;}public String getEmail() {return email;}public String getVerificationCode() {return verificationCode;}
}

Step 4: 实现自定义AuthenticationProvider
创建一个自定义的AuthenticationProvider,用于处理邮箱验证登录的认证逻辑。

@Component
public class EmailVerificationAuthenticationProvider implements AuthenticationProvider {@Overridepublic Authentication authenticate(Authentication authentication) throws AuthenticationException {String email = authentication.getName();String verificationCode = authentication.getCredentials().toString();// 在此处编写您的自定义认证逻辑// 比如根据email和verificationCode验证用户信息if (authenticationIsValid) {List<GrantedAuthority> authorities = new ArrayList<>();authorities.add(new SimpleGrantedAuthority("ROLE_USER"));CustomUserDetails userDetails = new CustomUserDetails(email, true, authorities);return new UsernamePasswordAuthenticationToken(userDetails, null, authorities);} else {throw new AuthenticationServiceException("Authentication failed");}}@Overridepublic boolean supports(Class<?> authentication) {return EmailVerificationToken.class.isAssignableFrom(authentication);}
}

Step 5: 实现自定义UserDetailsService
创建一个实现UserDetailsService接口的类,用于根据邮箱查询用户信息。

@Service
public class CustomUserDetailsService implements UserDetailsService {private final UserRepository userRepository;@Autowiredpublic CustomUserDetailsService(UserRepository userRepository) {this.userRepository = userRepository;}@Overridepublic UserDetails loadUserByUsername(String email) throws UsernameNotFoundException {// 在此处实现根据邮箱查询用户信息的逻辑CustomUser user = userRepository.findByEmail(email);if (user == null) {throw new UsernameNotFoundException("User not found with email: " + email);}List<GrantedAuthority> authorities = new ArrayList<>();authorities.add(new SimpleGrantedAuthority("ROLE_USER"));return new CustomUserDetails(user.getEmail(), user.isEnabled(), authorities);}
}

Step 6: 配置Spring Security
在Spring Security配置类中配置自定义过滤器、认证提供者和UserDetailsService。

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {private final EmailVerificationAuthenticationProvider emailVerificationAuthenticationProvider;private final CustomUserDetailsService customUserDetailsService;@Autowiredpublic SecurityConfig(EmailVerificationAuthenticationProvider emailVerificationAuthenticationProvider, CustomUserDetailsService customUserDetailsService) {this.emailVerificationAuthenticationProvider = emailVerificationAuthenticationProvider;this.customUserDetailsService = customUserDetailsService;}@Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception {auth.authenticationProvider(emailVerificationAuthenticationProvider);auth.userDetailsService(customUserDetailsService).passwordEncoder(passwordEncoder());}@Overrideprotected void configure(HttpSecurity http) throws Exception {http.addFilterBefore(emailVerificationAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class).authorizeRequests().antMatchers("/login").permitAll().anyRequest().authenticated().and().formLogin().loginPage("/login").defaultSuccessUrl("/dashboard").and().logout().logoutUrl("/logout").logoutSuccessUrl("/login");}@Beanpublic EmailVerificationAuthenticationFilter emailVerificationAuthenticationFilter() throws Exception {EmailVerificationAuthenticationFilter filter = new EmailVerificationAuthenticationFilter();filter.setAuthenticationManager(authenticationManagerBean());return filter;}@Beanpublic PasswordEncoder passwordEncoder() {return NoOpPasswordEncoder.getInstance(); // For simplicity, use NoOpPasswordEncoder}
}

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

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

相关文章

Redis 简介

文章目录 Redis 简介 Redis 简介 Redis&#xff08;Remote Dictionary Server&#xff09;&#xff0c;远程词典服务器&#xff0c;基于 C/S 架构&#xff0c;是一个基于内存的键值型 NoSQL 数据库&#xff0c;开源&#xff0c;遵守 BSD 协议&#xff0c;Redis 由 C语言 实现。…

JS之new Date(‘yyyy-MM-dd‘)多8小时问题

new Date(‘yyyy-MM-dd’)多8小时问题 原因 //会多8小时的转化 new Date("2023-08-02") //不会多8小时的转化 new Date("2023-8-2")因为月和天为个位数时前面带有0&#xff0c;这时会当你处于格林尼治国际标准时的时区&#xff08;0时区&#xff09;而你…

线上服务出现异常,获取链接超时wait millis 60 000, active 0, maxActive 400, creating 1

背景 最近线上服务出现出现异常&#xff0c;导致整个服务数据库不可用&#xff0c;查看报错信息为&#xff1a;org.springframework.jdbc.CannotGetJdbcConnectionException&#xff1a;wait millis 60 000, active 0, maxActive 400, creating 1" druid版本&#xff1a…

P4145 上帝造题的七分钟 2 / 花神游历各国

上帝造题的七分钟 2 / 花神游历各国 题目背景 XLk 觉得《上帝造题的七分钟》不太过瘾&#xff0c;于是有了第二部。 题目描述 "第一分钟&#xff0c;X 说&#xff0c;要有数列&#xff0c;于是便给定了一个正整数数列。 第二分钟&#xff0c;L 说&#xff0c;要能修改…

《向量数据库指南》——腾讯云向量数据库Tencent Cloud VectorDB产品特性,架构和应用场景

腾讯云向量数据库(Tencent Cloud VectorDB)是一款全托管的自研企业级分布式数据库服务,专用于存储、检索、分析多维向量数据。该数据库支持多种索引类型和相似度计算方法,单索引支持 10 亿级向量规模,可支持百万级 QPS 及毫秒级查询延迟。腾讯云向量数据库不仅能为大模型提…

前端Vue自定义精美商品分类组件category 可用于电商应用分类页面

随着技术的不断发展&#xff0c;传统的开发方式使得系统的复杂度越来越高。在传统开发过程中&#xff0c;一个小小的改动或者一个小功能的增加可能会导致整体逻辑的修改&#xff0c;造成牵一发而动全身的情况。为了解决这个问题&#xff0c;我们采用了组件化的开发模式。通过组…

MySQL踩坑之sql_mode的用法

目录 定义 报错重现 ​编辑 原因分析 sql_mode值说明 查看当前sql_mode 设置sql_mode 定义 什么是sql_mode?玩了这么久的MySQL语句࿰

SpringBoot整合Zookeeper

引入Jar包 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId> </dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>s…

JAVA开发工具-maven的安装与配置(最新最详细教程)

引言 Maven项目对象模型(POM)&#xff0c;可以通过一小段描述信息来管理项目的构建&#xff0c;报告和文档的项目管理工具 软件。 Maven 除了以程序构建能力为特色之外&#xff0c;还提供高级项目管理工具。由于 Maven 的缺省构建规则有较 高的可重用性&#xff0c;所以常常用两…

模电专题-MOS管的放大电路分析

在实际应用中&#xff0c;我们经常会使用到功率MOS&#xff0c;这时通常不会将它当成一个开关使用&#xff0c;而是当成一个放大器来使用&#xff0c;那这就需要让其工作在放大状态。 参考下图中的mos管的特性曲线&#xff0c;右图中的输出特性曲线中有一根红色的分界线&#x…

C# 进程

C# 进程 进程的命名空间是&#xff1a; using System.Diagnostics;1.获取当前计算机正在运行所有的进程 Process[] processes Process.GetProcesses(); for (int i 0; i < processes.Length; i) {Console.WriteLine(processes[i]); } Console.ReadKey();2.通过进程打开…

竞速榜实时离线对数方案演进介绍 | 京东云技术团队

一、背景 竞速榜是大促期间各采销群提供的基于京东实时销售数据的排行榜&#xff0c;同样应对大促流量洪峰场景&#xff0c;通过榜单撬动品牌在京东增加资源投入。竞速榜基于用户配置规则进行实时数据计算&#xff0c;榜单排名在大促期间实时变化&#xff0c;相关排名数据在微…

【雕爷学编程】Arduino动手做(181)---Maixduino AI开发板2

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

roop 视频换脸

roop: one click face swap. 只用一张人脸图片&#xff0c;就能完成视频换脸。 项目地址&#xff1a; https://github.com/s0md3v/roopColab 部署&#xff1a; https://github.com/dream80/roop_colab 本文是本地部署的实践记录。 环境基础 OS: Ubuntu 22.04.2 LTSKernel: 5…

操作系统专栏2-文件系统from小林coding

文件系统 文件系统构成虚拟文件系统文件的使用文件的存储连续存储非连续空间存放方式链表方式索引方式 Linux文件的实现方式 空闲分区的管理文件系统结构目录的存储软链接和硬链接 文件系统构成 Linux的设计哲学有一点很重要:一切皆文件,不仅仅是普通的文件和目录,就连块设备,…

程序员面试金典17.*

文章目录 17.01 不用加号的加法17.04 消失的数字17.05字母与数字17.06 2出现的次数17.07 婴儿名字17.08 马戏团人塔17.09 第k个数17.10 主要元素17.11 单词距离17.12 BiNode17.13 恢复空格&#xff08;未做&#xff0c;字典树dp&#xff09;17.14 最小K个数17.15 最长单词17.16…

Golang进阶学习

Golang进阶学习 视频地址&#xff1a;https://www.bilibili.com/video/BV1Pg41187AS?p35 1、包 1.1、包的引入 使用包的原因&#xff1a; 我们不可能把所有函数放在同一个源文件中&#xff0c;可以分门别类的放在不同的文件中 解决同名问题&#xff0c;同一个文件中不可以…

webpack基础知识一:说说你对webpack的理解?解决了什么问题?

一、背景 Webpack 最初的目标是实现前端项目的模块化&#xff0c;旨在更高效地管理和维护项目中的每一个资源 模块化 最早的时候&#xff0c;我们会通过文件划分的形式实现模块化&#xff0c;也就是将每个功能及其相关状态数据各自单独放到不同的JS 文件中 约定每个文件是一…

数字孪生的「三张皮」问题:数据隐私、安全与伦理挑战

引言 随着数字化时代的来临&#xff0c;数据成为了当今社会的宝贵资源。然而&#xff0c;数据的广泛使用也带来了一系列隐私、安全与伦理挑战。数字孪生作为一种虚拟的数字化实体&#xff0c;通过收集和分析大量数据&#xff0c;模拟和预测现实世界中的各种情境&#xff0c;为…

windows美化任务栏,不使用软件

1.任务栏透明: 效果图: (1).winr打开命令行 输入regedit回车打开注册表 regedit (2).在注册表中打开 \HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced 这个路径 \HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explore…