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 实战派》
相关推荐
深入云栈3 小时前
Netty 4.2.x 源码深度解析 (二十三):ByteBuf 核心设计 —— 索引、类型与零拷贝
java·后端·架构
JackJiang3 小时前
IM踩坑:聊天消息ID怎么设计?一个UUID搞不定,我用双ID解决
后端·架构
jay神3 小时前
基于 YOLOv8 的手势识别系统(Web 版)
前端·人工智能·python·深度学习·yolo·计算机视觉·计算机毕业设计
开心猴爷3 小时前
iOS 上架 App 流程
后端·ios
屏什么录3 小时前
长时间录屏中途崩溃:MP4 打不开的 6 种救回方案与参数设置
前端·音视频开发
code_Bo4 小时前
不只命令行:我把跨 Agent 会话同步做成了桌面应用
前端·javascript·后端
kyriewen4 小时前
AI 能把页面写出来,为什么改个需求就开始崩?
前端·javascript·人工智能
wang_shu_mo_ran4 小时前
MyBatis 从入门到进阶(一)
java·spring·mybatis
用户8356290780514 小时前
使用 Python 控制 Excel 工作表的分页位置
后端·python
用户8356290780515 小时前
Python 如何在 Word 中添加和管理文档变量
后端·python