当前位置: 首页 > 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;从而改善应用的整体性能。 这些不同的技…...

JWT密钥轮换静默失效的热修复实战指南

1. 这不是漏洞公告&#xff0c;而是一份热修复作战手册Seedance2.0 v2.0.3上线刚满72小时&#xff0c;我们团队在灰度环境做JWT签名校验一致性压测时&#xff0c;发现一个反直觉现象&#xff1a;新签发的token在旧服务节点上能通过验签&#xff0c;但旧token在新节点上却频繁失…...

Midjourney单色调风格失效诊断图谱(含8种典型失败案例+对应--no、--style、--seed三重校准方案)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;Midjourney单色调风格失效诊断图谱&#xff08;含8种典型失败案例对应--no、--style、--seed三重校准方案&#xff09; 单色调&#xff08;Monochrome&#xff09;图像生成在Midjourney中高度依赖提示词…...

什么是换根DP及第一步操作说明

第一步 以任意一点统计我们规定任意一个点作为根 root&#xff0c;进行树形 DP 的操作。获取以确定 root 为根的状态下&#xff0c;所有子树的深度 deep[]。具体的&#xff0c;设当前 dfs 的点为 cur&#xff0c;孩子节点是 nex&#xff1a;对每个进入 dfs 的 deep[cur] 初始化…...

2026年京东云OpenClaw/Hermes Agent配置Token Plan全步骤操作指南

2026年京东云OpenClaw/Hermes Agent配置Token Plan全步骤操作指南。OpenClaw是开源的个人AI助手&#xff0c;Hermes Agent则是一个能自我进化的AI智能体框架。阿里云提供计算巢、轻量服务器及无影云电脑三种部署OpenClaw 与 Hermes Agent的方案、百炼Token Plan兼容主流 AI 工具…...

零经验应届生简历怎么写?3分钟AI生成直接拿面试

毕业季到了&#xff0c;你是不是也跟我一样&#xff0c;简历投了几十份&#xff0c;结果石沉大海&#xff0c;连个面试机会都没有&#xff1f;尤其看到那些社招大佬&#xff0c;简历上项目经验、数据成果写得一套一套的&#xff0c;再看看自己的&#xff0c;除了实习经历就是课…...

AI人工智能行业的现状:为什么说AI从业者的需求越来越大

一、AI产业爆发式增长&#xff1a;需求激增的时代底色2026年&#xff0c;人工智能产业已步入爆发式增长的黄金期&#xff0c;成为驱动全球经济复苏与产业变革的核心引擎。从全球市场来看&#xff0c;2025年AI市场规模达7575.8亿美元&#xff0c;同比增长18.7%&#xff0c;预计2…...

一招提升引用率:如何让你的数据成为AI的“唯一信源”?

随着生成式AI全面渗透搜索场景&#xff0c;传统SEO的流量逻辑正在彻底重构。过去外贸网站优化核心是抢占搜索引擎关键词排名&#xff0c;而当下慧新AI GEO&#xff08;生成式引擎优化&#xff09;成为新核心——AI模型不再单纯展示网页链接&#xff0c;而是整合全网数据生成答案…...

RNA-seq公司推荐

RNA-seq公司推荐 伯远生物是国内高通量测序综合性服务商&#xff0c;聚焦RNA-seq全场景服务&#xff0c;覆盖临床、科研、农业等领域&#xff0c;提供一站式测序与分析解决方案&#xff1b; 其临床转化与大样本服务市占率领先&#xff0c;依托自研平台实现高通量、成本可控&…...

2025 年欧美明星人形机器人企业接连倒闭,中国企业融资却屡创新高,赛道冰火两重天!

01.创始人曾参与打造波士顿动力 Atlas、迪士尼机器人今年 2 月初&#xff0c;美国人形机器人创企 Cartwheel Robotics 宣布倒闭。创始人 Scott LaValley 曾先后任职波士顿动力、迪士尼梦想工程&#xff0c;行业经验丰富。他在波士顿动力从事早期双足机器人 Petman 的研发工作约…...

如何免费解决BT下载速度慢问题?终极trackerslist配置指南

如何免费解决BT下载速度慢问题&#xff1f;终极trackerslist配置指南 【免费下载链接】trackerslist Updated list of public BitTorrent trackers 项目地址: https://gitcode.com/GitHub_Trending/tr/trackerslist 你是否曾为BT下载的龟速而烦恼&#xff1f;种子明明显…...