Java Authentication and Authorization Service (JAAS) 是 Java 平台安全架構的重要組成部分。本文基於《Inside Java 2 Platform Security》第二版,深入剖析 JAAS 中三大核心實體——Subject、Principal、Credential 的定義、關係及認證流程。
JAAS 使用 Subject 代表系統中的實體,可以是用戶、服務、進程等任何主動實體。一個 Subject 封裝了該實體的所有安全相關狀態。
java.security.Principal 接口,核心方法 getName() 返回標識名。javax.security.auth.Subject 實例,並將代表該實體在該服務域中身份的 Principal 對象 添加進 Subject 的 Principal 集合中。Credential 是實體擁有的、用於證明身份的證據,分為兩類:
PrivateCredential 標記,訪問需權限檢查。常見憑證形式:密碼/口令、加密金鑰對、智能卡、生物特徵數據、Kerberos Ticket 等。
JAAS 採用傳統的基於名字的訪問控制模型:服務定義受保護資源集,並指定哪些 Principal(名字)可訪問哪些資源。應用通過檢查 Subject 關聯的 Principal 來做授權決策,實現了身份與權限的解耦。
public final class Subject {
// Principal 集合
public Set<Principal> getPrincipals() {...}
public <T extends Principal> Set<T> getPrincipals(Class<T> c) {...}
// 公共憑證集合
public Set<Object> getPublicCredentials() {...}
// 私有憑證集合(需權限)
public Set<Object> getPrivateCredentials() {...}
public <T> Set<T> getPrivateCredentials(Class<T> c) {...}
// 域分區:實現同一 Subject 在不同安全域隔離
public static Subject getSubject(AccessControlContext acc) {...}
public static void doAs(Subject subject, PrivilegedAction<?> action) {...}
public static void doAsPrivileged(Subject subject, PrivilegedAction<?> action, AccessControlContext acc) {...}
}
JAAS 通過 Subject 聚合多個 Principal 解決多域身份統一問題,通過 Credential 封裝多樣化身份證據 支持可插拔認證機制,通過 基於 Principal 的授權 實現細粒度訪問控制。這三大核心概念構成了 Java 安全編程的基石。