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

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

UserDetails

UserDetail 是 Spring 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 请求,并根据与定义的安全规则对其进行处理。

Filter 有 CsrfFilter、UsernamePasswordAuthenticationFilter、LogoutFilter 等。

参考

  • 《Spring Boot 实战派》
相关推荐
牛战士coding1 分钟前
用户点了停止生成,上游还在烧 token 吗?取消传播链路拆解
java·人工智能
Bug收容所4 分钟前
Vue+js Day2
前端·javascript·vue.js
货拉拉技术6 分钟前
JDK 21 规模化落地实践
后端
初心未改HD6 分钟前
DSH Skill开发实战:SKILL.md是给LLM看的操作手册,不是给人看的README,踩了4个坑
java·大数据·开发语言
isfox9 分钟前
MapTask 工作机制:从读数据到写磁盘,一个 Map 任务的完整一生
后端
aibo86030810 分钟前
基于 Spring Boot 的茶铺管理系统设计与实现
java·spring boot·后端
Wang's Blog25 分钟前
Java 项目实战: 交友项目 - SpringData-Mongo 环境搭建和 CRUD
java·开发语言·交友
SunnyDays101139 分钟前
Java 操作 PPT 超链接:添加、修改和删除
java·powerpoint·ppt·超链接
掘金酱43 分钟前
带着作品来,坐下来聊|掘金 X-lab · Coffee Talk 邀请你来见一面
前端·javascript·后端
Thomas.Sir1 小时前
第4课:配置文件详解:application.yml/properties,多环境配置、配置分组、配置校验
java·spring boot