首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 程式設計入門

深入理解 JAAS 安全架構:Subject、Principal 與 Credential

     編輯:Java 程式設計入門

JAAS 核心概念:Subject、Principal 與 Credential

Java Authentication and Authorization Service (JAAS) 是 Java 平台安全架構的重要組成部分。本文基於《Inside Java 2 Platform Security》第二版,深入剖析 JAAS 中三大核心實體——Subject、Principal、Credential 的定義、關係及認證流程。

1. Subject:系統實體的抽象

JAAS 使用 Subject 代表系統中的實體,可以是用戶、服務、進程等任何主動實體。一個 Subject 封裝了該實體的所有安全相關狀態。

2. Principal:身份標識的多面性

  • 定義:Principal 代表與 Subject 關聯的一個名字/身份標識。
  • 多重性:一個 Subject 可擁有多個 Principal,因為同一實體在不同安全域或服務中可能使用不同名字(如系統登錄名、郵箱、員工號等)。
  • 接口:所有 Principal 實現 java.security.Principal 接口,核心方法 getName() 返回標識名。

3. 認證流程與 Subject 填充

  1. 實體向服務發起認證請求,提供身份證明(Credential)。
  2. 服務驗證證明有效性(如密碼比對、數字簽名驗證、智能卡挑戰響應)。
  3. 認證成功後,創建 javax.security.auth.Subject 實例,並將代表該實體在該服務域中身份的 Principal 對象 添加進 Subject 的 Principal 集合中。
  4. 後續授權決策通過檢查 Subject 中的 Principal 來確定權限。

4. Credential:身份證據

Credential 是實體擁有的、用於證明身份的證據,分為兩類:

  • 公共憑證:可被他人知曉,如 X.509 證書、公鑰。
  • 私有憑證:僅實體自身知曉,如密碼、PIN、私鑰、智能卡。JAAS 中用 PrivateCredential 標記,訪問需權限檢查。

常見憑證形式:密碼/口令、加密金鑰對、智能卡、生物特徵數據、Kerberos Ticket 等。

5. 基於 Principal 的訪問控制

JAAS 採用傳統的基於名字的訪問控制模型:服務定義受保護資源集,並指定哪些 Principal(名字)可訪問哪些資源。應用通過檢查 Subject 關聯的 Principal 來做授權決策,實現了身份與權限的解耦。

6. 關鍵類結構

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) {...}
}

7. 總結

JAAS 通過 Subject 聚合多個 Principal 解決多域身份統一問題,通過 Credential 封裝多樣化身份證據 支持可插拔認證機制,通過 基於 Principal 的授權 實現細粒度訪問控制。這三大核心概念構成了 Java 安全編程的基石。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved