当前位置: 首页 > news >正文

SpringSecurity自定义登录方式

自定义登录:

  1. 定义Token
  2. 定义Filter
  3. 定义Provider
  4. 配置类中定义登录的接口
  1. 自定义AuthenticationToken
public class EmailAuthenticationToken extends UsernamePasswordAuthenticationToken{public EmailAuthenticationToken(Object principal, Object credentials) {super(principal, credentials);}public EmailAuthenticationToken(Object principal, Object credentials, Collection<? extends GrantedAuthority> authorities) {super(principal, credentials, authorities);}
}
  1. 自定义AuthenticationFilter
public class EmailAuthenticationFilter extends AbstractAuthenticationProcessingFilter {private static final String EMAIL = "email";private static final String EMAIL_CODE = "emailCode";private boolean postOnly = true;public EmailAuthenticationFilter(RequestMatcher requestMatcher) {super(requestMatcher);}@Overridepublic Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException, IOException, ServletException {if (this.postOnly && !request.getMethod().equals("POST")) {throw new AuthenticationServiceException("Authentication method not supported: " + request.getMethod());} else {Map<String, String> map = new ObjectMapper().readValue(request.getInputStream(), Map.class);String email = map.get(EMAIL);email = email != null ? email : "";email = email.trim();String emailCode = map.get(EMAIL_CODE);emailCode = emailCode != null ? emailCode : "";EmailAuthenticationToken emailAuthenticationToken = new EmailAuthenticationToken(email, emailCode);this.setDetails(request, emailAuthenticationToken);return this.getAuthenticationManager().authenticate(emailAuthenticationToken);}}protected void setDetails(HttpServletRequest request, EmailAuthenticationToken authRequest) {authRequest.setDetails(this.authenticationDetailsSource.buildDetails(request));}
}
  1. 自定义AuthenticationProvider
public class EmailAuthenticationProvider implements AuthenticationProvider {@Overridepublic Authentication authenticate(Authentication authentication) throws AuthenticationException {EmailAuthenticationToken emailAuthenticationToken = (EmailAuthenticationToken) authentication;String code = emailAuthenticationToken.getCode();String email = (String) emailAuthenticationToken.getPrincipal();if (email.equals("205564122@qq.com") && code.equals("1234")) {SimpleGrantedAuthority simpleGrantedAuthority = new SimpleGrantedAuthority("wuyu");return new EmailAuthenticationToken(email, null, List.of(simpleGrantedAuthority));}throw new InternalAuthenticationServiceException("认证失败");}@Overridepublic boolean supports(Class<?> authentication) {return EmailAuthenticationToken.class.isAssignableFrom(authentication);}
}
  1. 定义SecurityConfig配置类
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {@Resourceprivate StringRedisTemplate stringRedisTemplate;@Override@Beanpublic AuthenticationManager authenticationManagerBean() throws Exception {return super.authenticationManagerBean();}@Overrideprotected void configure(HttpSecurity http) throws Exception {http.csrf().disable();http.cors().disable();http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);http.authorizeHttpRequests().anyRequest().permitAll();http.logout().logoutSuccessHandler(logoutSuccessHandler());// 配置邮箱登录EmailAuthenticationFilter emailAuthenticationFilter = new EmailAuthenticationFilter(new AntPathRequestMatcher("/login/email", "POST"));emailAuthenticationFilter.setAuthenticationManager(authenticationManagerBean());emailAuthenticationFilter.setAuthenticationSuccessHandler(authenticationSuccessHandler());emailAuthenticationFilter.setAuthenticationFailureHandler(authenticationFailureHandler());http.addFilterBefore(emailAuthenticationFilter, UsernamePasswordAuthenticationFilter.class);http.authenticationProvider(new EmailAuthenticationProvider());}@Beanpublic AuthenticationSuccessHandler authenticationSuccessHandler() {return (request, response, authentication) -> {// 1.生成TokenString token = UUID.randomUUID().toString();// 2.将Token和用户信息存入redisstringRedisTemplate.opsForValue().set(AuthConstants.TOKEN_PREFIX + token, JSON.toJSONString(authentication.getPrincipal()), AuthConstants.TOKEN_DURATION);// 3.返回Tokenresponse.setContentType(ResponseConstants.APPLICATION_JSON);PrintWriter writer = response.getWriter();writer.write(JSON.toJSONString(Result.success(token)));writer.flush();writer.close();};}@Beanpublic AuthenticationFailureHandler authenticationFailureHandler() {return (request, response, exception) -> {response.setContentType(ResponseConstants.APPLICATION_JSON);PrintWriter writer = response.getWriter();writer.write(JSON.toJSONString(Result.fail(exception.getMessage())));writer.flush();writer.close();};}@Beanpublic LogoutSuccessHandler logoutSuccessHandler() {return (request, response, authentication) -> {String authorization = request.getHeader(AuthConstants.AUTHORIZATION);authorization = authorization.replace(AuthConstants.BEARER, "");stringRedisTemplate.delete(AuthConstants.TOKEN_PREFIX + authorization);PrintWriter writer = response.getWriter();writer.write(JSON.toJSONString(Result.success()));writer.flush();writer.close();};}
}

相关文章:

SpringSecurity自定义登录方式

自定义登录&#xff1a; 定义Token定义Filter定义Provider配置类中定义登录的接口 自定义AuthenticationToken public class EmailAuthenticationToken extends UsernamePasswordAuthenticationToken{public EmailAuthenticationToken(Object principal, Object credentials) …...

黑神话悟空是什么游戏 黑神话悟空配置要求 黑神话悟空好玩吗值得买吗 黑神话悟空苹果电脑可以玩吗

《黑神话&#xff1a;悟空》的类型定义是一款单机动作角色扮演游戏&#xff0c;但实际体验后会发现&#xff0c;游戏在很多设计上采用了「魂like」作品的常见元素。根据个人上手试玩&#xff0c;《黑神话&#xff1a;悟空》的推进节奏比较接近魂类游戏&#xff0c;Boss战也更像…...

深入浅出消息队列----【延迟消息的实现原理】

深入浅出消息队列----【延迟消息的实现原理】 粗说 RocketMQ 的设计细说 RocketMQ 的设计这样实现是否有什么问题&#xff1f; 本文仅是文章笔记&#xff0c;整理了原文章中重要的知识点、记录了个人的看法 文章来源&#xff1a;编程导航-鱼皮【yes哥深入浅出消息队列专栏】 粗…...

npm提示 certificate has expired 证书已过期 已解决

在用npm新建项目时&#xff0c;突然发现报错提示 : certificate has expired 证书已过期 了解一下&#xff0c;在网络通信中&#xff0c;HTTPS 是一种通过 SSL/TLS 加密的安全 HTTP 通信协议。证书在 HTTPS 中扮演着至关重要的角色&#xff0c;用于验证服务器身份并加密数据传输…...

KEIL如何封装文件成lib

一、为什么要封装文件成LIB 提高编译效率 如果一份文件已经在整个工程中发挥出了我们期待的作用&#xff0c;现在想要将其封装成库&#xff0c;则可以在已经成型的工程文件中将不需要编译的文件从工程全部移出掉&#xff0c;只留下我们需要封装的文件&#xff0c;这样就可以提…...

【python】OpenCV—Faster Video File FPS

文章目录 1、需求描述2、正常方法 cv2.read3、加速方法 imutils.video.FileVideoStream4、涉及到的核心库函数4.1、imutils.video.FPS4.2、imutils.video.FileVideoStream 5、参考 1、需求描述 使用线程和队列数据结构将视频文件的 FPS 速率提高 &#xff01; 我们的目标是将…...

JavaScript变量的类型转换

类型转换分为两种:显示类型转换、隐式类型转换 1.显示类型转换 String()Number()Boolean()toString()parseInt(string)parseFloat(string)2.隐式类型转换 (1)isNaN () 判断指定的参数是否为 NaN(非数字类型),返回结果为 Boolean 类型。也就是说:任何不能被转换为数值的…...

如何申请免费SSL证书以消除访问网站显示连接不安全提醒

在当今互联网时代&#xff0c;网络安全已成为一个不可忽视的问题。当用户浏览一些网站时&#xff0c;有时会看到浏览器地址栏出现“不安全”的提示&#xff0c;这意味着该网站没有安装SSL证书&#xff0c;数据传输可能存在风险。那么&#xff0c;如何消除这种不安全提醒&#x…...

关于P2P(点对点)

P2P 是一种客户端与客户端之间&#xff0c;点对点连接的技术&#xff0c;在早前的客户端都是公网IP&#xff0c;没有NAT的情况下&#xff0c;P2P是较为容易实现的。 但现在的P2P&#xff0c;实现上面会略微有一些复杂&#xff1a;需要采取UDP打洞的技术&#xff0c;但UDP打出来…...

前端怎么本地起一个服务查看本地文件

1.安装拓展 安装 Live Server拓展 2.创建一个html文件 3.在html文件中右键选择 Open with Live Server 4.浏览器打开运行的地址&#xff0c;并去除路径&#xff0c;例如:http://127.0.0.1:5500/...

建造者模式(Builder Pattern)

建造者模式&#xff08;Builder Pattern&#xff09;是一种创建型设计模式&#xff0c;它主要用于将一个复杂对象的构建与它的表示分离&#xff0c;使得同样的构建过程可以创建不同的表示。这种设计模式的核心思想是将一个复杂对象的构建分解成多个相对简单的步骤&#xff0c;并…...

【MySQL】索引 【下】{聚簇索引VS非聚簇索引/创建主键索引/全文索引的创建/索引创建原则}

文章目录 1.聚簇索引 VS 非聚簇索引经典问题 2.索引操作创建主键索引唯一索引的创建普通索引的创建全文索引的创建查询索引删除索引索引创建原则 1.聚簇索引 VS 非聚簇索引 之前介绍的将所有的数据都放在叶子节点的这种存储引擎对应的就是 InnoDB 默认存储表数据的存储结构。 …...

论文快过(图像配准|Coarse_LoFTR_TRT)|适用于移动端的LoFTR算法的改进分析 1060显卡上45fps

项目地址&#xff1a;https://github.com/Kolkir/Coarse_LoFTR_TRT 创建时间&#xff1a;2022年 相关训练数据&#xff1a;BlendedMVS LoFTR [19]是一种有效的深度学习方法&#xff0c;可以在图像对上寻找合适的局部特征匹配。本文报道了该方法在低计算性能和有限内存条件下的…...

免费发送邮件两种接口方式:SMTP和邮件API

SMTP与邮件API在处理大批量邮件发送时&#xff0c;哪个更稳定&#xff1f; 在现代信息化的社会中&#xff0c;邮件已成为不可或缺的沟通工具。无论是个人还是企业&#xff0c;发送邮件都是日常工作的一部分。AokSend将详细介绍两种常用的免费发送邮件接口方式&#xff1a;SMTP…...

大模型日报 2024-07-30

大模型日报 2024-07-30 大模型资讯 开源AI性能逼近专有领袖&#xff0c;最新基准测试揭示 摘要: Galileo最新的幻觉指数显示&#xff0c;开源AI模型的性能正在迅速逼近专有巨头。这一发现表明&#xff0c;开源AI在技术进步和性能提升方面取得了显著进展&#xff0c;缩小了与专有…...

docker 构建 mongodb

最近需要在虚拟机上构建搭建mongo的docker容器&#xff0c;搞了半天老有错&#xff0c;归其原因&#xff0c;是因为现在最新的mango镜像的启动方式发生了变化&#xff0c;故此现在好多帖子&#xff0c;就是错的。 ok&#xff0c;话不多说&#xff1a; # 拉取最新镜像&#xf…...

LeetCode每日练习 | 二分查找 | 数组 |Java | 图解算法

&#x1f64b;大家好&#xff01;我是毛毛张! &#x1f308;个人首页&#xff1a; 神马都会亿点点的毛毛张 &#x1f4cc; 你真的刷明白了二分查找吗⁉️记得看毛毛张每个题目中写的【注意细节】⚠️ 文章目录 0.前言&#x1f341;1.[704. 二分查找&#x1f34d;](https://l…...

2024年获客新渠道,大数据爬虫获客:技术实现精准抓取数据资源

**2024年获客新渠道&#xff1a;大数据爬虫获客及技术实现精准抓取数据资源** ### 一、大数据爬虫获客概述 在2024年&#xff0c;随着大数据技术的不断发展和互联网的普及&#xff0c;大数据爬虫获客已经成为企业获取客户信息、实现精准营销的重要渠道。爬虫技术通过自动化程…...

滑模变结构控制仿真实例(s-function代码详解)

目录 一、建立系统数学模型二、控制器设计1. 设计滑模面(切换面)2.设计控制器 u3. 稳定性证明 三、 Matlab 仿真1. s-function 模型2. 主要代码3. 仿真结果(采用符号函数sign(s))4. 仿真结果(采用饱和函数sat(s)) 一、建立系统数学模型 { x ˙ 1 x 2 x ˙ 2 x 3 x ˙ 3 x 1 …...

MySQL处理引擎

MySQL中的数据用各种不同的技术存储在文件(或者内存)中。这些技术中的每一种都 使用不同的存储机制、索引技巧、锁定水平并且最终提供广泛的、不同的功能和能力。通过 选择不同的技术&#xff0c;能够获得额外的速度或者功能&#xff0c;从而改善应用的整体性能。 这些不同的技…...

Windows主题自由革命:SecureUxTheme安全启动兼容的内存补丁终极指南

Windows主题自由革命&#xff1a;SecureUxTheme安全启动兼容的内存补丁终极指南 【免费下载链接】SecureUxTheme &#x1f3a8; A secure boot compatible in-memory UxTheme patcher 项目地址: https://gitcode.com/gh_mirrors/se/SecureUxTheme 厌倦了Windows千篇一律…...

5个超实用技巧:用Awesome Adb实现手机调试效率倍增

5个超实用技巧&#xff1a;用Awesome Adb实现手机调试效率倍增 【免费下载链接】awesome-adb ADB Usage Complete / ADB 用法大全 项目地址: https://gitcode.com/gh_mirrors/aw/awesome-adb 副标题&#xff1a;告别繁琐操作&#xff0c;让Android设备管理效率提升10倍 …...

鲁棒估计与5点算法求解本质矩阵

发散&#xff0c;无法保证找到全局正确的解。鉴于5点算法的代数复杂性和实现难度&#xff08;涉及高次多项式求根、病态方程处理等&#xff09;&#xff0c;并且考虑到本系列文章的核心主题是数值优化而非代数几何&#xff0c;我们在此不展开其繁琐的数学推导和代码实现细节。感…...

ASPP模块的演进与优化:从DeepLab v2到v3+的多尺度语义分割实践

1. 多尺度语义分割的挑战与ASPP的诞生 想象一下你要给一张街景照片中的每个像素分类——哪些是道路、哪些是车辆、哪些是行人。最大的困难是什么&#xff1f;是远处的小车和近处的大卡车可能属于同一类别&#xff0c;但尺寸差异巨大。这就是语义分割中的多尺度问题&#xff0c;…...

RCE漏洞小结

RCE漏洞简介 所谓RCE漏洞&#xff0c;即Remote Code/Command Execution&#xff0c;远程代码执行和远程命令执行漏洞。在很多Web应⽤中&#xff0c;开发⼈员会使⽤⼀些函数&#xff0c;这些函数以⼀些字符串作为输⼊&#xff0c;功能是将输⼊的字符串当作代码或者命令来进⾏执…...

网络异常排查:快速定位域连接问题

问题描述与初步排查网络位置异常通常表现为计算机无法正确识别当前所在的AD域环境&#xff0c;导致访问域资源受限或登录问题。常见症状包括系统托盘显示“无法访问域”、组策略无法应用、DNS解析失败等。检查计算机是否能够ping通域控制器的主机名和IP地址。使用nslookup命令验…...

AI辅助学术写作:Qwen3-0.6B-FP8搭配LaTeX生成论文章节与参考文献

AI辅助学术写作&#xff1a;Qwen3-0.6B-FP8搭配LaTeX生成论文章节与参考文献 写论文&#xff0c;尤其是写引言和参考文献&#xff0c;是不是让你特别头疼&#xff1f;对着空白的文档发呆&#xff0c;不知道从何下笔&#xff1b;或者为了找一篇关键的参考文献&#xff0c;在数据…...

Musicdl革新性全场景音乐解决方案:5个维度揭秘开源音乐下载技术的破局之道

Musicdl革新性全场景音乐解决方案&#xff1a;5个维度揭秘开源音乐下载技术的破局之道 【免费下载链接】musicdl Musicdl: A lightweight music downloader written in pure python. 项目地址: https://gitcode.com/gh_mirrors/mu/musicdl 在数字音乐产业蓬勃发展的今天…...

国际首都公报:湖北省放飞炬人国际控股集团国际总裁方达炬批准《湖北省放飞炬人国际控股集团国际军务涉军事法院规章》施行

国际首都公报&#xff1a;湖北省放飞炬人国际控股集团国际总裁方达炬批准《湖北省放飞炬人国际控股集团国际军务涉军事法院规章》施行...

【OFDM通信】基于matlab室内NOMA-OFDM-VLC系统仿真【含Matlab源码 15240期】

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到海神之光博客之家&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49…...