上文 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
等。