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 实战派》
相关推荐
AlienZHOU4 小时前
AI Coding 时代下,我的技术面试实践分享
前端·后端·面试
野生技术架构师5 小时前
2026 Java 面试全套总结,八股 + 场景 + AI 相关面试考点
java·人工智能·面试
香吧香6 小时前
java服务异常日志只打印异常类型,没有堆栈定位分析
java·jvm·异常
qq_2518364576 小时前
AI 疾病自查功能SpringbootAI项目实战 · 技术实现文档
java·ai·ai编程
狗头大军之江苏分军6 小时前
《潮水漫过十七岁》开学了
后端
逆境不可逃7 小时前
Pi Agent 学习笔记:对话太长以后,如何压缩上下文
java
MetaLite7 小时前
JDK 8~26 核心特性一览:从 Stream 到 Scoped Values
java
苏三说技术7 小时前
如何看待GPT-6在UP主众测中碾压夺冠?它是现在最强大模型吗?
后端
mldong7 小时前
一份 JSON,一条能跑的审批流:把报销流程送上工作流引擎
后端·架构
wno7047 小时前
Spring Boot WebFlux增删改查
java·spring boot·后端