Spring Security
中,使用接口Authentication
抽象建模这样一个概念:认证令牌token
,它要么代表一个认证之前的认证请求,要么代表一个认证之后的被认证了的主体,这里所提到的"认证",指的是方法调用AuthenticationManager#authenticate(Authentication)
。
Authentication
认证令牌对象表示认证请求的时候,通常它包含了请求中用户提供的身份信息和认证信息,比如用户名/密码表单认证的场景中,此时Authentication
其实包含的就是用户名和密码。一旦经过认证,同一个Authentication
认证令牌对象会包含对应认证主体的更多信息,比如权限和用户详情,并且通常会被通过SecurityContextHolder
保存为一个线程本地(ThreadLocal
)对象。
Spring Security
提供了缺省的安全上下文和认证对象管理机制,开箱即用,所以在很多情况下,开发人员不需要关注这些细节。不过开发人员也可以自己实现认证逻辑然后通过SecurityContextHolder
安全上下文持有器管理认证对象 :
SecurityContextHolder.getContext().setAuthentication(anAuthentication)
源代码
源代码版本 : Spring Security Config 5.1.4.RELEASE
package org.springframework.security.core;
import java.io.Serializable;
import java.security.Principal;
import java.util.Collection;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.core.context.SecurityContextHolder;
// 继承自Java 的 Principal, Principal 表示访问者主体,比如用户个人,作为访问者的公司
public interface Authentication extends Principal, Serializable {
// 表示授予访问主体的访问权限,总是不能返回 null ,可以是空集合
// 如果尚未认证,这里也不能是 null ,要是空集合
Collection<? extends GrantedAuthority> getAuthorities();
// 用于证明主体身份的凭证信息,通常是密码,当然也可以是其他信息,具体来讲,
// 是什么要跟使用的 AuthenticationManager 认证管理器有关
Object getCredentials();
// 附加保存管理认证请求的额外详情信息。可能是IP地址,也可能是证书序列号之类。
// 如果不使用,返回 null
Object getDetails();
// 获取被认证主体自身的标识。在用户名/密码认证机制下,认证之前,这里就是用户名字符串。
// 认证之后,从 AuthenticationManager 返回的该认证令牌对象 Authentication 的该属性会
// 包含被认证主体的更多信息,此时该属性值不再是用户名字符串,而是变成了包含更多用户
// 信息的对象 UserDetails
Object getPrincipal();
// 返回当前认证令牌对象是否已经经过认证
// 该属性用于告诉 AbstractSecurityInterceptor 是否要将该认证令牌对象交给 AuthenticationManager
// 进行认证:
// true -- 不再需要该认证令牌对象交给 AuthenticationManager进行认证
// false -- 需要该认证令牌对象交给 AuthenticationManager进行认证
boolean isAuthenticated();
// 将该认证令牌对象设置为 false : 不再可信 或者 true : 经过认证,可信
// 实现类要总是能使该方法接收 false 以确保各种使用者可以将该认证令牌对象设置为不再可信;
// 如果该方法接收到了参数 true,而实现类不想接收 true(因为这样可能存在潜在安全风险),
// 那么可以抛出 IllegalArgumentException 异常
void setAuthenticated(boolean isAuthenticated) throws IllegalArgumentException;
}
框架提供的实现类
名称 | 简介 |
---|---|
AnonymousAuthenticationToken | 表示匿名用户的认证令牌对象 |
UsernamePasswordAuthenticationToken | 表示基于用户名/密码进行认证的认证令牌对象,提供两个构造函数: 1.认证之前基于用户名密码构造对象,属性 isAuthenticated 设置为false ,2.认证之后构造对象,属性 isAuthenticated 设置为true |
RememberMeAuthenticationToken | 基于"记住我"机制进行认证的认证令牌对象 |
TestingAuthenticationToken | 用于单元测试的认证令牌对象,对象构造之后isAuthenticated 总是true |