SpringSecurity自定义登录方式
自定义登录:
- 定义Token
- 定义Filter
- 定义Provider
- 配置类中定义登录的接口
- 自定义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);}
}
- 自定义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));}
}
- 自定义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);}
}
- 定义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自定义登录方式
自定义登录: 定义Token定义Filter定义Provider配置类中定义登录的接口 自定义AuthenticationToken public class EmailAuthenticationToken extends UsernamePasswordAuthenticationToken{public EmailAuthenticationToken(Object principal, Object credentials) …...
黑神话悟空是什么游戏 黑神话悟空配置要求 黑神话悟空好玩吗值得买吗 黑神话悟空苹果电脑可以玩吗
《黑神话:悟空》的类型定义是一款单机动作角色扮演游戏,但实际体验后会发现,游戏在很多设计上采用了「魂like」作品的常见元素。根据个人上手试玩,《黑神话:悟空》的推进节奏比较接近魂类游戏,Boss战也更像…...
深入浅出消息队列----【延迟消息的实现原理】
深入浅出消息队列----【延迟消息的实现原理】 粗说 RocketMQ 的设计细说 RocketMQ 的设计这样实现是否有什么问题? 本文仅是文章笔记,整理了原文章中重要的知识点、记录了个人的看法 文章来源:编程导航-鱼皮【yes哥深入浅出消息队列专栏】 粗…...
npm提示 certificate has expired 证书已过期 已解决
在用npm新建项目时,突然发现报错提示 : certificate has expired 证书已过期 了解一下,在网络通信中,HTTPS 是一种通过 SSL/TLS 加密的安全 HTTP 通信协议。证书在 HTTPS 中扮演着至关重要的角色,用于验证服务器身份并加密数据传输…...
KEIL如何封装文件成lib
一、为什么要封装文件成LIB 提高编译效率 如果一份文件已经在整个工程中发挥出了我们期待的作用,现在想要将其封装成库,则可以在已经成型的工程文件中将不需要编译的文件从工程全部移出掉,只留下我们需要封装的文件,这样就可以提…...
【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 速率提高 ! 我们的目标是将…...
JavaScript变量的类型转换
类型转换分为两种:显示类型转换、隐式类型转换 1.显示类型转换 String()Number()Boolean()toString()parseInt(string)parseFloat(string)2.隐式类型转换 (1)isNaN () 判断指定的参数是否为 NaN(非数字类型),返回结果为 Boolean 类型。也就是说:任何不能被转换为数值的…...
如何申请免费SSL证书以消除访问网站显示连接不安全提醒
在当今互联网时代,网络安全已成为一个不可忽视的问题。当用户浏览一些网站时,有时会看到浏览器地址栏出现“不安全”的提示,这意味着该网站没有安装SSL证书,数据传输可能存在风险。那么,如何消除这种不安全提醒&#x…...
关于P2P(点对点)
P2P 是一种客户端与客户端之间,点对点连接的技术,在早前的客户端都是公网IP,没有NAT的情况下,P2P是较为容易实现的。 但现在的P2P,实现上面会略微有一些复杂:需要采取UDP打洞的技术,但UDP打出来…...
前端怎么本地起一个服务查看本地文件
1.安装拓展 安装 Live Server拓展 2.创建一个html文件 3.在html文件中右键选择 Open with Live Server 4.浏览器打开运行的地址,并去除路径,例如:http://127.0.0.1:5500/...
建造者模式(Builder Pattern)
建造者模式(Builder Pattern)是一种创建型设计模式,它主要用于将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。这种设计模式的核心思想是将一个复杂对象的构建分解成多个相对简单的步骤,并…...
【MySQL】索引 【下】{聚簇索引VS非聚簇索引/创建主键索引/全文索引的创建/索引创建原则}
文章目录 1.聚簇索引 VS 非聚簇索引经典问题 2.索引操作创建主键索引唯一索引的创建普通索引的创建全文索引的创建查询索引删除索引索引创建原则 1.聚簇索引 VS 非聚簇索引 之前介绍的将所有的数据都放在叶子节点的这种存储引擎对应的就是 InnoDB 默认存储表数据的存储结构。 …...
论文快过(图像配准|Coarse_LoFTR_TRT)|适用于移动端的LoFTR算法的改进分析 1060显卡上45fps
项目地址:https://github.com/Kolkir/Coarse_LoFTR_TRT 创建时间:2022年 相关训练数据:BlendedMVS LoFTR [19]是一种有效的深度学习方法,可以在图像对上寻找合适的局部特征匹配。本文报道了该方法在低计算性能和有限内存条件下的…...
免费发送邮件两种接口方式:SMTP和邮件API
SMTP与邮件API在处理大批量邮件发送时,哪个更稳定? 在现代信息化的社会中,邮件已成为不可或缺的沟通工具。无论是个人还是企业,发送邮件都是日常工作的一部分。AokSend将详细介绍两种常用的免费发送邮件接口方式:SMTP…...
大模型日报 2024-07-30
大模型日报 2024-07-30 大模型资讯 开源AI性能逼近专有领袖,最新基准测试揭示 摘要: Galileo最新的幻觉指数显示,开源AI模型的性能正在迅速逼近专有巨头。这一发现表明,开源AI在技术进步和性能提升方面取得了显著进展,缩小了与专有…...
docker 构建 mongodb
最近需要在虚拟机上构建搭建mongo的docker容器,搞了半天老有错,归其原因,是因为现在最新的mango镜像的启动方式发生了变化,故此现在好多帖子,就是错的。 ok,话不多说: # 拉取最新镜像…...
LeetCode每日练习 | 二分查找 | 数组 |Java | 图解算法
🙋大家好!我是毛毛张! 🌈个人首页: 神马都会亿点点的毛毛张 📌 你真的刷明白了二分查找吗⁉️记得看毛毛张每个题目中写的【注意细节】⚠️ 文章目录 0.前言🍁1.[704. 二分查找🍍](https://l…...
2024年获客新渠道,大数据爬虫获客:技术实现精准抓取数据资源
**2024年获客新渠道:大数据爬虫获客及技术实现精准抓取数据资源** ### 一、大数据爬虫获客概述 在2024年,随着大数据技术的不断发展和互联网的普及,大数据爬虫获客已经成为企业获取客户信息、实现精准营销的重要渠道。爬虫技术通过自动化程…...
滑模变结构控制仿真实例(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中的数据用各种不同的技术存储在文件(或者内存)中。这些技术中的每一种都 使用不同的存储机制、索引技巧、锁定水平并且最终提供广泛的、不同的功能和能力。通过 选择不同的技术,能够获得额外的速度或者功能,从而改善应用的整体性能。 这些不同的技…...
多模态2025:技术路线“神仙打架”,视频生成冲上云霄
文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...
Linux-07 ubuntu 的 chrome 启动不了
文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了,报错如下四、启动不了,解决如下 总结 问题原因 在应用中可以看到chrome,但是打不开(说明:原来的ubuntu系统出问题了,这个是备用的硬盘&a…...
逻辑回归暴力训练预测金融欺诈
简述 「使用逻辑回归暴力预测金融欺诈,并不断增加特征维度持续测试」的做法,体现了一种逐步建模与迭代验证的实验思路,在金融欺诈检测中非常有价值,本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...
【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案
目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后,迭代器会失效,因为顺序迭代器在内存中是连续存储的,元素删除后,后续元素会前移。 但一些场景中,我们又需要在执行删除操作…...
pikachu靶场通关笔记19 SQL注入02-字符型注入(GET)
目录 一、SQL注入 二、字符型SQL注入 三、字符型注入与数字型注入 四、源码分析 五、渗透实战 1、渗透准备 2、SQL注入探测 (1)输入单引号 (2)万能注入语句 3、获取回显列orderby 4、获取数据库名database 5、获取表名…...
车载诊断架构 --- ZEVonUDS(J1979-3)简介第一篇
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 做到欲望极简,了解自己的真实欲望,不受外在潮流的影响,不盲从,不跟风。把自己的精力全部用在自己。一是去掉多余,凡事找规律,基础是诚信;二是…...
渗透实战PortSwigger Labs指南:自定义标签XSS和SVG XSS利用
阻止除自定义标签之外的所有标签 先输入一些标签测试,说是全部标签都被禁了 除了自定义的 自定义<my-tag onmouseoveralert(xss)> <my-tag idx onfocusalert(document.cookie) tabindex1> onfocus 当元素获得焦点时(如通过点击或键盘导航&…...
CMS内容管理系统的设计与实现:多站点模式的实现
在一套内容管理系统中,其实有很多站点,比如企业门户网站,产品手册,知识帮助手册等,因此会需要多个站点,甚至PC、mobile、ipad各有一个站点。 每个站点关联的有站点所在目录及所属的域名。 一、站点表设计…...
比特币:固若金汤的数字堡垒与它的四道防线
第一道防线:机密信函——无法破解的哈希加密 将每一笔比特币交易比作一封在堡垒内部传递的机密信函。 解释“哈希”(Hashing)就是一种军事级的加密术(SHA-256),能将信函内容(交易细节…...
篇章一 论坛系统——前置知识
目录 1.软件开发 1.1 软件的生命周期 1.2 面向对象 1.3 CS、BS架构 1.CS架构编辑 2.BS架构 1.4 软件需求 1.需求分类 2.需求获取 1.5 需求分析 1. 工作内容 1.6 面向对象分析 1.OOA的任务 2.统一建模语言UML 3. 用例模型 3.1 用例图的元素 3.2 建立用例模型 …...
