了解 JWT 身份验证:Spring Security 的架构和 Go 实现
设置 JWT 无状态身份验证(可在此处获取)后,我想通过识别关键组件及其交互来了解 Spring Security 抽象下发生的情况。为了使这种探索更有吸引力,我使用标准 HTTP 库在 Go 中重新实现了一个最小版本。通过分解三个核心流程 - 注册、令牌生成和受保护的资源访问 - 并在 Go 中重建它们,我开始将 Spring Security 的身份验证模式映射到更简单的组件。
这篇文章特别关注身份验证流程 - 系统如何验证用户身份 - 而不是授权。我们将使用序列图探索流程,这些序列图通过 Spring Security 架构中的不同组件跟踪请求。
主要部件
系统提供三个端点:
- 用户注册:接受新用户的用户名和密码
- 令牌生成(登录):当用户使用有效凭据成功登录时创建 JWT 令牌
- 受保护的访问:使经过身份验证的用户能够使用其令牌访问受保护的资源。 getAuthenticatedUser 端点作为示例,返回经过身份验证的令牌持有者的个人资料信息
在以下部分中,我将解释每个流程中涉及的核心组件,并为每个流程提供序列图。
注册流程
包含用户名和密码的注册请求通过 Spring Security 过滤器链,由于注册端点被配置为不需要在 SecurityConfiguration 中进行身份验证,因此在该过滤器链中进行的处理最少。然后请求通过 Spring 的 DispatcherServlet,后者根据 URL 模式将其路由到 UserController 中的适当方法。请求到达 UserController 的注册端点,其中用户信息与散列密码一起存储。
代币生成流程
包含用户名和密码的登录请求通过 Spring Security 过滤器链,其中发生最少的处理,因为此端点也配置为不需要在 SecurityConfiguration 中进行身份验证。请求通过 Spring 的 DispatcherServlet 移动到 UserController 的登录端点,该端点委托给 AuthenticationManager。使用 ApplicationConfiguration 中定义的配置 bean,AuthenticationManager 根据存储的凭据验证提供的凭据。身份验证成功后,UserController 使用 JwtService 生成包含用户信息和创建时间等元数据的 JWT 令牌,该令牌将返回给客户端以供后续经过身份验证的请求。
受保护的资源访问流程
成功的身份验证流程 (200)
身份验证流程失败 (401)
当授权标头中包含 JWT 令牌的请求到达时,它会通过 JwtAuthenticationFilter - 自定义定义的 OncePerRequestFilter - 它使用 JwtService 处理令牌。如果有效,过滤器将通过 ApplicationConfiguration 中配置的 UserDetailsService 检索用户,并在 SecurityContextHolder 中设置身份验证。如果令牌丢失或无效,过滤器将允许请求继续,而无需设置身份验证。
在链的后面,AuthorizationFilter 检查请求是否通过 SecurityContextHolder 进行了正确的身份验证。当它检测到缺少身份验证时,它会抛出 AccessDeniedException。此异常由 ExceptionTranslationFilter 捕获,它检查用户是否是匿名的,并委托给 SecurityConfiguration 中配置的 JwtAuthenticationEntryPoint 返回 401 Unauthorized 响应。
如果所有过滤器都通过,请求将到达 Spring 的 DispatcherServlet,后者将其路由到 UserController 中的 getAuthenticatedUser 端点。此端点从过滤器链过程中填充的 SecurityContextHolder 检索经过身份验证的用户信息。
注意:Spring Security 采用丰富的过滤器和专用组件生态系统来处理各种安全问题。为了理解核心身份验证流程,我只关注 JWT 令牌验证和用户身份验证中的关键参与者。
Go 实现:映射组件
Go 实现通过映射到关键 Spring Security 组件的简化架构提供类似的功能:
过滤链
- 提供 Spring Security 过滤器链的最小版本
- 按顺序处理每个请求的过滤器
- 使用每个请求链实例(VirtualFilterChain)来实现线程安全
调度员
- 映射到 Spring 的 DispatcherServlet
- 安全过滤器处理后将请求路由到适当的处理程序
身份验证上下文
- 使用Go的上下文包来存储每个请求的身份验证状态
- 映射到 Spring 的 SecurityContextHolder
JwtFilter
- 直接相当于Spring的JwtAuthenticationFilter
- 提取并验证 JWT 令牌
- 成功验证后填充身份验证上下文
身份验证过滤器
- Spring的AuthorizationFilter的简化版
- 专注于身份验证
- 检查身份验证上下文,如果缺失则返回 401
JwtService
- 类似于Spring的JwtService
- 处理令牌生成和验证
- 使用相同的核心 JWT 操作,但配置更简单
测试覆盖率
两种实现都包括验证密钥身份验证场景的集成测试(auth_test.go 和 AuthTest.java):
报名流程
- 使用有效凭据成功用户注册
- 重复的用户名注册尝试
登录流程
- 使用有效凭据成功登录
- 尝试使用不存在的用户名登录
- 尝试使用错误密码登录
受保护的资源访问
- 使用有效令牌成功访问
- 没有 auth header 的访问尝试
- 尝试使用无效令牌格式进行访问
- 使用过期令牌进行访问
- 尝试使用有效的令牌格式进行访问,但用户不存在
Java 实现包括详细注释,通过 Spring Security 的过滤器链解释每个测试场景的流程。使用等效组件在 Go 实现中复制这些相同的流程。
旅程总结
我通过将 Spring Security 的 JWT 身份验证分解为流程和测试用例来研究它。然后我将这些模式映射到 Go 组件。集成测试向我展示了请求如何流经 Spring Security 的过滤器链和组件。构建这些模式的简单版本帮助我理解了 Spring Security 的设计。测试证明两种实现都以相同的方式处理身份验证。通过分析、测试和重建,我对 Spring Security 的身份验证工作原理有了更深入的了解。
以上是了解 JWT 身份验证:Spring Security 的架构和 Go 实现的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

Golang在性能和可扩展性方面优于Python。1)Golang的编译型特性和高效并发模型使其在高并发场景下表现出色。2)Python作为解释型语言,执行速度较慢,但通过工具如Cython可优化性能。

Golang在并发性上优于C ,而C 在原始速度上优于Golang。1)Golang通过goroutine和channel实现高效并发,适合处理大量并发任务。2)C 通过编译器优化和标准库,提供接近硬件的高性能,适合需要极致优化的应用。

goisidealforbeginnersandsubableforforcloudnetworkservicesduetoitssimplicity,效率和concurrencyFeatures.1)installgromtheofficialwebsitealwebsiteandverifywith'.2)

Golang适合快速开发和并发场景,C 适用于需要极致性能和低级控制的场景。1)Golang通过垃圾回收和并发机制提升性能,适合高并发Web服务开发。2)C 通过手动内存管理和编译器优化达到极致性能,适用于嵌入式系统开发。

GoimpactsdevelopmentPositationalityThroughSpeed,效率和模拟性。1)速度:gocompilesquicklyandrunseff,ifealforlargeprojects.2)效率:效率:ITScomprehenSevestAndArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdEcceSteral Depentencies,增强开发的简单性:3)SimpleflovelmentIcties:3)简单性。

Golang和Python各有优势:Golang适合高性能和并发编程,Python适用于数据科学和Web开发。 Golang以其并发模型和高效性能着称,Python则以简洁语法和丰富库生态系统着称。

Golang和C 在性能上的差异主要体现在内存管理、编译优化和运行时效率等方面。1)Golang的垃圾回收机制方便但可能影响性能,2)C 的手动内存管理和编译器优化在递归计算中表现更为高效。

Golang和C 在性能竞赛中的表现各有优势:1)Golang适合高并发和快速开发,2)C 提供更高性能和细粒度控制。选择应基于项目需求和团队技术栈。
