Spring Security 核心类

上文 Spring Security 简单了解使用 我们已经了解了些 Spring Security 的知识点。本文,我们了解下其核心类。

SecurityContext

SecurityContext 中包含当前正在访问系统的用户的详细信息,有以下两种方法。

方法 说明
getAuthentication() 获取当前经过身份验证的主体或者身份验证的请求令牌
setAuthentication() 更改或者删除当前已验证的主体身份验证信息

SecurityContextHolder

SecurityContextHolder 用来保存 SecurityContext。最常用的是 getContext() 方法,用来获取当前 SecurityContext

SecurityContextHolder 中定义了一系列的静态方法,而这些静态方法的内部逻辑是通过 SecurityContextHolder 持有的 SecurityContextHolderStrategy 来实现,比如 clearContext()

ProviderManager

ProviderManager 会维护一个认证的列表,以便处理不同认证方式的认证,因为系统可能会存在多种认证方式,比如手机号、用户密码、邮件方式等。

在认证时,如果 ProviderManager 的认证结果不是 null,则说明认证成功,不再进行其他方式的认证,并且作为认证的结果保存在 SecurityContext 中。如果不成功,则抛出错误信息 ProviderNotFoundException

DaoAuthenticationProvider

DaoAuthenticationProviderAuthenticationProvider 最常用的实现,用来获取用户提交的用户名和密码,并进行正确性对比。如果正确,则返回一个数据库中的用户信息。

UserDetails

UserDetailSpring Security 的用户实体,包含用户名、密码、权限等信息。 Spring Security 默认实现了内置的 User 类,供 Spring Security 安全认证使用。当然,也可以自己实现。

UserDetails 提供以下几种方法:

  • String getPassword():返回验证用户密码,无法返回则显示为 null
  • String getUsername():返回验证用户名,无法返回则显示为 null
  • boolean isAccountNonExpired():账户是否过期,过期则无法验证
  • boolean isAccountNonLocked():指定用户是否被锁定或者解锁,锁定的用户无法进行身份验证
  • boolean isCredentialsNonExpired():指定是否已过期的用户的凭证(密码),过期的凭证无法认证。
  • boolean isEnabled():是否被禁用,禁用的用户不能进行身份验证。

UserDetailsService

用户相关的信息通过 UserDetailsService 接口来加载。该接口的唯一方法是 loadUserByUsername(String username),用来根据用户名加载相关信息。返回值是 UserDetails 接口,其中包含用户的信息:用户名、密码、权限、是否启用、是否被锁定、是否过期等。

GrantedAuthority

GrantedAuthority 中定义了一个 getAuthority() 方法。该方法返回一个字符串,表示对应权限的字符串。如果对应权限不能用字符串表示,则返回 null

GrantedAuthority 接口通过 UserDetailsService 进行加载,然后赋予 UserDetails

Filter

Filter 用户处理 Web 请求并进行安全验证。Filter 在请求之前和之后执行一些操作,例如身份验证、授权、记录日志等。它可以拦截传入的 HTTP 请求,并根据与定义的安全规则对其进行处理。

FilterCsrfFilterUsernamePasswordAuthenticationFilterLogoutFilter 等。

参考

  • 《Spring Boot 实战派》
相关推荐
UIUV31 分钟前
Splitter学习笔记(含RAG相关流程与代码实践)
后端·langchain·llm
_Eleven35 分钟前
Pinia vs Vuex 深度解析与完整实战指南
前端·javascript·vue.js
cipher39 分钟前
HAPI + 设备指纹认证:打造更安全的远程编程体验
前端·后端·ai编程
雨中飘荡的记忆40 分钟前
保证金系统入门到实战
java·后端
WeNTaO41 分钟前
ACE Engine FrameNode 节点
前端
郑鱼咚1 小时前
现在的AI热潮,恰恰证明了这个世界就是个草台班子
前端·人工智能·程序员
Striver_1 小时前
elpis总结——基于koa的elpis-core
前端
Nyarlathotep01131 小时前
Java内存模型
java
阿慧勇闯大前端1 小时前
在AI时代,再去了解react19新特性还有用吗? 最近总有朋友问我:“现在AI写代码这么厉害了,我写个需求丢给ChatGPT,几秒钟就生成一堆组件,还学新特
前端·react.js
秋水无痕1 小时前
从零搭建个人博客系统:Spring Boot 多模块实践详解
前端·javascript·后端