Spring Security : 概念模型 Authentication 认证令牌对象

本文深入探讨SpringSecurity中Authentication认证令牌的概念与作用,包括其在认证前后的状态变化,以及如何通过SecurityContextHolder管理认证对象。此外,还介绍了框架提供的几种认证令牌实现类。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值