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 实战派》
相关推荐
lbh3 小时前
当我开始像写代码一样和AI对话,一切都变了
前端·openai·ai编程
短剑重铸之日3 小时前
《ShardingSphere解读》07 读写分离:如何集成分库分表+数据库主从架构?
java·数据库·后端·架构·shardingsphere·分库分表
知我Deja_Vu3 小时前
【避坑指南】ConcurrentHashMap 并发计数优化实战
java·开发语言·python
We་ct4 小时前
LeetCode 918. 环形子数组的最大和:两种解法详解
前端·数据结构·算法·leetcode·typescript·动态规划·取反
wefly20174 小时前
m3u8live.cn 在线M3U8播放器,免安装高效验流排错
前端·后端·python·音视频·前端开发工具
daidaidaiyu4 小时前
Spring IOC 源码学习 事务相关的 BeanDefinition 解析过程 (XML)
java·spring
C澒5 小时前
微前端容器标准化 —— 公共能力篇:通用打印
前端·架构
德育处主任Pro5 小时前
前端元素转图片,dom-to-image-more入门教程
前端·javascript·vue.js
木斯佳5 小时前
前端八股文面经大全:小红书前端一二面OC(下)·(2026-03-17)·面经深度解析
前端·vue3·proxy·八股·响应式
zhanggongzichu5 小时前
小白怎么理解后端分层概念
后端·全栈