Spring-Security 认证流程分析及多方式登录认证实践

Spring Security实现登录 Spring Security是Spring框架下的一个用于身份验证和授权的框架,它可以帮忙管理web应用中的用户认证、授权以及安全性问题。环境准备Spring Security核心概念实现基本登录功能添加Spring Security的数据库认证Spring Security是一个非常好用的身份认证和授权框架,可以有效保证应用的安全性。本文介绍了如何使用Spring Security实现基本的登录功能和数据库认证,希望这篇文章能够帮助到你。。 阅读详情

👉 这是一个或许对你有用的社群

🐱 一对一交流/面试小册/简历优化/求职解惑,欢迎加入「芋道快速开发平台」知识星球。下面是星球提供的部分资料: 

f94ed6fddb3bc6f61b394dce20cd8025.gif

👉这是一个或许对你有用的开源项目

国产 Star 破 10w+ 的开源项目,前端包括管理后台 + 微信小程序,后端支持单体和微服务架构。

功能涵盖 RBAC 权限、SaaS 多租户、数据权限、商城、支付、工作流、大屏报表、微信公众号、CRM 等等功能:

  • Boot 仓库:https://gitee.com/zhijiantianya/ruoyi-vue-pro

  • Cloud 仓库:https://gitee.com/zhijiantianya/yudao-cloud

  • 视频教程:https://doc.iocoder.cn

【国内首批】支持 JDK 21 + SpringBoot 3.2.2、JDK 8 + Spring Boot 2.7.18 双版本 

来源:juejin.cn/post/
7329144188926967860


1 前言

在项目开发过程中,会涉及到安全框架的配置。其中常用的就是 shiro 和 spring-security,在本文中将介绍 spring-security 的工作流程和实践应用,并基于此总结其使用心得和项目配置关键。

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/ruoyi-vue-pro

  • 视频教程:https://doc.iocoder.cn/video/

2 spring security 认证和权限流程

548fd87a07fc3d650e36060fe1e3688d.jpeg

如上图所示,一个请求在达到控制器之前,会经过一系列的过滤器 DefaultSecurityFilterChain,绿色的部分负责用户认证,蓝色的部分处理认证异常的情况,橙色的部分负责用户的授权,最终请求到控制器的方法。在认证完成之后,会将用户认证的结果 Authentication 放进 SecurityContextHolder 中,从中可以获取到用户信息。

在开始之前,需要先介绍一下其他重要的组件

  • SecurityContextHolder: 存放身份信息的容器

  • Authentication: 用户信息的抽象即 security 的认证主体

  • AbstractAuthenticationToken: authentication 即认证主体的抽象类,

  • AuthenticationManager: 身份认证器接口,具体实现类为 ProviderManager

  • AuthenticationProvider: 用来处理 authentication 的认证信息

  • AuthenticationSuccessHandler 认证成功处理器

  • AuthenticationFailureHandler 认证失败处理器

认证的流程如下所示:

1、用户请求的接口经过 security 过滤器,按照其登录方式适配的 authentication 封装其认证方法,通过 AuthenticationProvider 来进行处理认证。获取身份信息会按照其配置provider的顺序来处理。

2、通常情况下将身份信息封装到封装成Authentication下的实现类UsernamePasswordAuthenticationToken, 通常是用户密码的登录方式。

3、通过 AuthenticationManager 身份管理器,通过其配置的provider 验证这个UsernamePasswordAuthenticationToken 的信息。

4、认证逻辑一般是在 service 中,认证成功之后会返回认证信息,AuthenticationManager.authentication身份管理器返回一个Authentication实例(上下文中包含权限信息,身份信息,细节信息,但是密码会被移除)。

5、SecurityContextHolder 上下文容器会填充UsernamePasswordAuthenticationToken信息,通过 SecurityContextHolder.getContext().setAuthentication()方法可以查看其上下文用户信息。

上述流程具体来说,如下图所示:

eec60d998eee371ecedc6ba3a61efc07.jpeg

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/yudao-cloud

  • 视频教程:https://doc.iocoder.cn/video/

3 spring security 登录配置

通常情况下,都是用户名和密码表单的方式进行登录,同时在登录时还会添加动态验证码和自动登录的方式,具体如下图所示:

a5c8dad0b9556d3e98586233211fd58e.jpeg

核心配置如下所示:

1、拦截认证请求配置,这里需要配置不需要登录就可以访问的资源,包括登录页面、请求提交页面,静态资源等内容。

  • 登录请求不拦截 permitAll

  • 资源需要某些角色 hasRole

  • 资源访问需要某些权限 hasAuthority

  • 其它的资源需要经过认证,在资源权限上的配置也可以通过注解的方式在控制器中设置

2、登录页面配置,需要配置登录请求的参数,登录页面,登录访问路径以及成功和失败的处理器,这里需要注意的是,successForwardUrl 是请求转发的方式,defaultSuccessUrl是重定向的方式。

3、退出的配置,这里需要配置的是退出的地址以及session 和 authentication 的处理。

4、session 的管理,通常情况下在前后端不分离的情况下,需要用 session 进行管理,在前后端分离的情况下,一般通过 token 的方式来存储用户信息。maximumSessions 表示最大的用户登录数量。

5、在处理异常的情况时,配置异常信息的处理器,通常是错误页或者返回错误信息,accessDeniedHandler 即权限异常处理器

6、在登录时,还会有记住我的选项,需要配置 token 的配置信息,以及记住我的参数信息。

7、csrf/cors/frameoptions/cache 的配置方式。

8、此外还会有 addFilterAt/addFilterAfter/addFilterBefore 的方式来处理自定义的过滤器。

89e4754b34938fae67037fe3d87aac5a.jpeg

spring-security 的其它配置如下所示,可以配置信息提示的国际化,身份认证的方式,自定义 AuthenticationManager,以及配置token 的持久化方式,这里包括内存方式和数据库方式。

3930375a388170454318ba259253dbf5.jpeg

如果登录需要配置验证码的方式,则需要配置验证码的方式,这里需要处理图片验证码。配置密码处理器,这里为了方便起见,使用的是明文密码。资源的配置可以配置静态资源的方式,来配置静态资源和某些接口的访问权限。

578d82762881f3126f7ca6b07e6236a2.jpeg

KaptchaFilter 是用来配置验证码的处理,通常情况下登录需要需要 post 的方式,对于验证码的处理方式,需要先生成验证码存储到内存中,然后登录时需要携带验证码参数来进行校验而后进行下一个过滤器处理。

ac8f715cd3cb26837a62d79838288415.jpeg

最后,需要注意的是,在设置登录后成功的主页面时,如果配置的是请求转发的方式,其访问方式需要和登录处理器的 http method 保持一致。

4 spring security 表单认证流程

通过上述的表单认证配置,通过源码分析可以得知如下的表单认证流程,具体如下图所示:

b4f26dd7fe602822b4e6119cdaeca6af.jpeg

1、SecurityContextPersistenceFilter 拦截所有的请求,共享会话将 session 中的 SecurityContext 信息放进线程上下文中。

2、AbstractAuthenticationProcessingFilter 判断是否需要认证,需要认证就获取认证 Authentication,然后放进 session 中。

3、未认证的请求由 UsernamePasswordAuthenticationFilter 创建 UsernamePasswordAuthenticationToken 进行认证,委托 ProviderManager (即 AuthenticationManager) 发起认证,由多个 AuthenticationProvider 接口列表组成进行循环处理。

4、DaoAuthenticationProvider 调用 UserDetailsService 方法进行用户查询,最终返回 AuthenticationToken 即 UsernamePasswordAuthenticationToken

5、整个过程中出现认证失败情况交由 ExceptionTranslationFilter 进行处理

6、所有的配置拦截规则在 FilterSecurityInterceptor 中体现,判断用户是否有权限访问资源。

5 手机号和邮箱验证码登录

通过以上的分析,已经明晰了 spring security 认证相关的内容,通常情况下,系统的登录不仅有账号密码登录,还有手机号验证码、第三方授权等登录多种方式,在接下来将要介绍的就是手机号验证码登录和邮箱登录的方式。

接下来将要重点介绍的如下:

  • 继承 AbstractAuthenticationProcessingFilter,重写 attemptAuthentication 用于获取登录提交参数,并校验验证码是否正确

  • 继承 AuthenticationProvider,重写 authenticate 方法,从数据库查询用户信息,并完成 AuthenticationToken 对象封装。

  • 继承 AbstractAuthenticationToken, 重写构造方法,完成对象封装以及授权。

如下图所示,完成如下配置即可完成手机号验证码登录的功能。

c4a24bf702a8abc2748dbd9008ee4216.jpeg

核心的两处代码如下图所示:参数的获取以及请求的token 封装认证。

94053a1104413bb36867111a38be07fe.jpeg

用户认证成功后封装用户信息。

a7309e847c1dcfc9eaa9e602fbe5d66a.jpeg

除此之外,还有发送验证码的接口,通常验证码会存储在 redis 中,通过凭证来从缓存中获取并校验。

25d578a3598016073d3468a76c4c6dd9.jpeg

手机号登录流程如下:

  1. 调用发送验证码接口,发送验证码,本例是在控制台打印验证码。

  2. 通过表单或者json格式都可以提交信息完成认证。

  3. 用户认证成功或者失败时,通过认证成功或者失败处理器进行处理,返回 json 数据格式或者是页面。

终于搞懂了spring security 相关的认证流程和认证成功的处理方式,此外,还可以通过如下方式,通过注入 AuthenticationManager 调用认证方式来处理用户认证信息。

13d64842d8b4367e926a1bec96597b8a.jpeg

6 总结

本文主要介绍了 spring security 登录相关的核心配置,以及验证码方式登录的实践, spring security 作为系统开发中常用的权限认证框架,在此基础上拓展了项目的多种登录方式,即手机验证码和邮箱验证码的方式,同时也介绍了前后端分离与不分离情况下的差异。

本文总结了 spring security 常用的使用方式,可以很好的为后续开发提供借鉴。所涉及的代码已经上传至 gitee:https://gitee.com/xieyue86/springsecurity-learn


欢迎加入我的知识星球,全面提升技术能力。

👉 加入方式,“长按”或“扫描”下方二维码噢:

d30807d288a4e02a1016e4e2f76bbff8.png

星球的内容包括:项目实战、面试招聘、源码解析、学习路线。

bfc4d2deb870f18bc6141f5ae452f10f.png

6d94ef0ef7e8e923eeb95dc31ab7b974.pngd5a75b3cc9947d08416c3f3f6206c31f.png33fe2cdcd417c217d45a64ecab1d1893.pngfd8f2820aed5b1eed396d9f725c7e0ec.png

文章有帮助的话,在看,转发吧。
谢谢支持哟 (*^__^*)
Security实战之认证流程 基于SpringSecurity 6版本,介绍认证流程、实战演示 阅读详情

相关推荐

SpringSecurity6.x 多种登录方式配置

4. 配置SecurityConfiguration,把上边的两个 登录过滤器加到过滤器链中。在编写多种登录方式的时候,网上大多是5.x的,很多类都没了。以下是SpringSecurity6.x多种登录方式的写法。SpringSecurity6.x变了很多写法。2. 编写第二种登录方式-手机验证码登录。3. 编写验证码登录处理器。

qq_32681671的博客 2857

SpringBoot + Spring Security多种登录方式:账号+微信网页授权登录

一、概述实现账号用户名+微信网页授权登录集成在Spring Security的思路,最重要的一点是要实现微信登录通过Spring Security安全框架时,不需要验证账号、密码。二、准备工作要实现该功能,首先需要掌握Spring Security框架和微信扫码登录接口相关技术,如果对这两块还不太熟悉,可以参考:1、Springboot + Spring Security实现前后端分离登录认证及权...

Java知音 6130

Spring Security认证授权流程

在以上代码的for循环中,第一次拿到的 provider 是一个 Anonymous Authentication Provider。Spring Security会监听这个事件,接收到这个Authentication对象,进而调用 SecurityContextHolder.getContext().setAuthentication(...)方法,将 Authentication Manager返回的 Authentication对象,存储在当前的 Security Context 对象中。

2303_78503642的博客 3935

SpringSecurity登录流程

SpringSecurity登录流程 1.无处不在的Authentication 实现类中,我们最常用的是UsernamePasswordAuthenticationToken 2.登录流程 Spring Security中,认证和授权的校验都是在一系列过滤器链完成的,和认证相关的过滤器就是UsernamePasswordAuthenticationFilter public Authentication attemptAuthentication(HttpServletRequest reque

weixin_45802793的博客 4435

Spring Security认证过程

Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。它提供了一组可以在Spring应用上下文中配置的Bean,充分利用了Spring IoC,DI(控制反转Inversion of Control ,DI:Dependency Injection 依赖注入)和AOP(面向切面编程)功能,为应用系统提供声明式的安全访问控制功能,减少了为企业系统安全控制编写大量重复代码的工作。

weixin_38927257的博客 5193

Spring Security 6.x 系列(11)—— Form表单认证和注销流程

① 首先,用户向未授权的资源 /private 发出未经身份认证的请求。 ② Spring Security 的 AuthorizationFilter 抛出 AccessDeniedException 异常。 ③ 由于用户未经过身份验证,因此 ExceptionTranslationFilter 将启动“启动身份验证”,并使用配置的 AuthenticationEntryPoint 将重定向发送到登录页。 ④ 浏览器请求重定向到的登录页面。 ⑤ 呈现默认登录页面。

gmHappy 8692

Spring Security 认证流程分析及多方式登录认证实践

在项目开发过程中,会涉及到安全框架的配置。其中常用的就是shiro和, 在本文中将介绍的工作流程和实践应用,并基于此总结其使用心得和项目配置关键。本文主要介绍了登录相关的核心配置,以及验证码方式登录的实践,作为系统开发中常用的权限认证框架,在此基础上拓展了项目的多种登录方式,即手机验证码和邮箱验证码的方式,同时也介绍了前后端分离与不分离情况下的差异。本文总结了常用的使用方式,可以很好的为后续开发提供借鉴。所涉及的代码已经上传至gitee项目gitee地址。

1355

H3C交换机S-MLAG实战:如何用bond4模式实现服务器高可用(附避坑指南)

本文详细介绍了H3C交换机S-MLAG技术与服务器bond4模式的实战配置,帮助实现跨设备链路聚合的服务器高可用方案。通过解析S-MLAG技术优势、bond4模式选择、关键配置步骤及常见问题排查,提供了一套完整的避坑指南和优化建议,适用于企业级网络架构的高可用需求。

weixin_30790841的博客 466

清晰搞懂Spring Security的登录认证

在简单学习完成Redis之后,又进行了SpringSecurity的学习,这里学习的资源为三更草堂的SpringSecurity框架教程,讲得感觉还不错,推荐😁。这里主要是对学习过程进行一个记录和总结,参考的仍然是三更草堂的笔记,但中间加上了自己的一些理解和看法以及一些遇到的问题总结,如果哪里有问题还请各位指点指点😻。

陈宝子的博客 9821

解决mmdet3d安装中因PyTorch高版本引发的THC.h缺失问题

本文详细分析了在安装mmdet3d时,因PyTorch版本过高导致THC.h头文件缺失的常见报错问题。文章指出该错误的本质是PyTorch 1.7+版本废弃了旧API,与老版本C++扩展代码不兼容。提供了两种核心解决方案:一是降级PyTorch至1.6及以下版本;二是修改源码,将THC.h引用替换为ATen/cuda等新头文件,并给出了具体的代码修改示例和排查技巧。

weixin_29085151的博客 383

从‘最速控制’到代码:深入拆解韩京清ADRC中TD跟踪器的fhan函数(含Matlab/Simulink实例)

本文深入解析韩京清ADRC中的fhan函数,从理论到代码实现,详细拆解其在Matlab/Simulink中的应用。通过分析最速控制问题和非线性TD的连续形式,揭示fhan函数在信号处理和噪声抑制中的独特优势,并提供工程实践中的参数整定和优化技巧。

weixin_42659194的博客 248

认证流程分析及多方式登录认证实践

认证流程分析及多方式登录认证实践

845

学习Ultralytics (下载)

Ultralytics由创立,最初是为了简化目标检测模型的开发和应用,专注于构建高效、易用、性能卓越的深度学习框架。其主要产品之一是 YOLO 系列模型,尤其是最新的YOLOv5和YOLOv8,因其在精度、速度和可扩展性方面的出色表现而广受欢迎。

2301_76846375的博客 2868

spring security 认证流程分析

覆盖此接口以适配业务用户表结构。

LCY133的博客 1006

OpenIddict实战:5步搞定.NET Core应用的OIDC单点登录集成

本文详细介绍了如何使用OpenIddict在.NET Core应用中快速实现OIDC单点登录集成。通过五个关键步骤,包括环境准备、数据库集成、客户端注册、令牌配置和多应用SSO集成,帮助开发者高效构建安全的企业级单点登录解决方案。

lambda的博客 728

ThingsBoard教程(十九):规则节点概览介绍

在ThingsBoard的CE V2.5.6版本中,一共有这几种类型在每一种类都有包含了多个节点,每一种类型的节点都有不同的颜色表示本篇文章做一个简单的概括,后续的文章会详细讲解每一个种类的节点如何使用,每一个节点的使用。一共有10个,使用黄色表示 过滤器节点用于消息过滤和路由。一共有9个,使用绿色 属性节点用于更新传入消息的元数据。一共三个,使用蓝色 转换节点用于更改传入消息字段,如发起者、消息类型、有效负载和元数据。一共21个,使用红色标识 动作节点根据传入的消息执行各种动作。一共9个,使用黄色表示,

知无涯 1万+

spring security认证流程分析

理解此流程有助于快速定位认证问题(如密码未加密、用户服务未正确实现)并实现定制化需求(如多因素认证、第三方登录集成)。以下从整体视角分析其登录流程,涵盖从请求到认证完成的每一步细节。Spring Security 的登录流程是一个多组件协作的复杂过程,涉及。:生成新的 Session ID,防止会话固定攻击。(若启用):生成持久化 Cookie 用于自动登录。:不主动创建,但使用已存在的 Session。:无状态,不创建或使用 Session。(默认):需要时创建(如登录成功)。(基于 Session)。

LCY133的博客 1106

YOLOv11缝合添加注意力机制:添加YOLO-Face的SEAM到并行通道空间注意力机制【附代码】

在目标检测的实际应用中,物体遮挡是一个严重影响检测精度的难点。本文将基于YOLOv11架构,探索融合YOLO-Face中提出的SEAM注意力机制以提升对遮挡物体的感知能力,并在此基础上提出一种轻量化双路径并行注意力机制C2PSA,进一步提升检测性能。

一键难忘的博客 1533

Security 登录认证流程详细分析 源码与图相结合

最近在写毕业设计的时候用这个框架,小伙伴给我提了个多种登录方式的需求,说仅仅只有账号、密码登录不太行,说让我增加几种方式,如:手机短信验证登录、邮箱验证登录、第三方登录等等(前两个已经实现,第三方登录还没搞定)一开始也挺让人懵逼,无从下手的。 看了好几篇博客,都弄的不完整,或者就是太高级了,我不太能行。之后就是看博客,说弄懂原理、流程后,写多种方式其实也蛮简单。然后我就老老实实的去Debug了。 这样子的效果是十分好的,多Debug几回,无论是对使用,还是对于编写代码,以及对这个技术的理解都会加深一些,以.

北 1178

boost::circular_buffer缓行缓冲区

1、circular_buffer实现了一个环形缓冲区,空间大小是固定的,当到达容器末尾时,将自动利用容器另一端的位置空间。 2、当程序需要容纳大量的元素,但多数情况下仅保存较少数量元素时可以使用circular_buffer_space_optimized,他可以有效的减少内存的占用,提高程序的运行效率。 3、主要接口: 4、实现一个生产者---消费者模式示例: #inc...

小米的修行之路 793

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

上一篇: Java面试,问八股文的面试官水平很次?
下一篇: 入职第一天,看了公司代码,牛马沉默了
公众号-芋道源码
博客等级 码龄10年 1636粉丝 377原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值