java學習心得筆記
現在,讓我們更詳細地看一下這個訪問控制序列中的重要元素。
permissioncollection 類
大多數許可權類類型都有一個相應的 permissioncollection 類。這樣一個集合的實例可以通過調用 permission 子類實現定義的 newpermissioncollection() 方法來創建。java.security.policy 類實現的 getpermissions() 方法也可以返回 permissions 類實例 — permissioncollection 的一個子類。這個類代表由 permissioncollection 組織的不同類型許可權對象的一個集合。permissions 類的 implies(permission p) 方法可以調用單個 permissioncollection 類的 implies(permission p) 方法。
codesource 和 protectiondomain 類
許可權組合與 codesource(被用于驗證簽碼(signed code)的代碼位置和證書)被封裝在 protectiondomain 類中。有相同許可權和相同 codesource 的類實例被放在相同的域中。帶有相同許可權,但不同 codesource 的類被放在不同的域中。一個類只可屬于一個 protectiondomain。要為對象獲取 protectiondomain,請使用 java.lang.class 類中定義的 getprotectiondomain() 方法。
許可權
賦予 codesource 許可權并不一定意味著允許所暗示的操作。要使操作成功完成,調用棧中的每個類必須有必需的許可權。換句話說,如果您將 java.io.filepermission 賦給類 b,而類 b 是由類 a 來調用,那么類 a 必須也有相同的許可權或者暗示 java.io.filepermission 的許可權。
在另一方面,調用類可能需要臨時許可權來完成另一個擁有那些許可權的類中的操作。例如,當從另一個位置加載的類訪問本地文件系統時,我們可能不信任它。但是,本地加載的類被授予對某個目錄的讀許可權。這些類可以實現 privilegedaction 接口來給予調用類許可權以便完成指定的操作。調用棧的檢查在遇到 privilegedaction 實例時停止,有效地將執行指定操作所必需的許可權授予所有的后繼類調用。
使用 jaas
顧名思義,jaas 由兩個主要組件組成:認證和授權。我們主要關注擴展 jaas 的授權組件,但開始我們先簡要概述一下 jaas 認證,緊接著看一下一個簡單的 jaas 授權操作。
jaas 中的用戶認證
jaas 通過添加基于 subject 的策略加強了 java 2 中定義的訪問控制安全性模型。許可權的授予不僅基于 codesource,還基于執行代碼的用戶。顯然,要使這個模型生效,每個用戶都必須經過認證。
jaas 的認證機制建立在一組可插登錄模塊的基礎上。jaas 分發版包含幾個 loginmodule 實現。loginmodules 可以用于提示用戶輸入用戶標識和密碼。logincontext 類使用一個配置文件來確定使用哪個 loginmodule 對用戶進行認證。這個配置可以通過系統屬性 java.security.auth.login.config 指定。一個示例配置是:
java -djava.security.auth.login.config=login.conf
下面是一個登錄配置文件的樣子:
example {
com.ibm.resource.security.auth.loginmoduleexample required
debug=true userfile="users.xml" groupfile="groups.xml";
};
認識您的主體
subject 類被用于封裝一個被認證實體(比如用戶)的憑證。一個 subject 可能擁有一個被稱為主體(principal)的身份分組。例如,如果 subject 是一個用戶,用戶的名字和相關的社會保險號可能是 subject 的某些身份或主體。主體是與身份名關聯在一起的。
principal 實現類及其名稱都是在 jaas 策略文件中指定的。缺省的 jaas 實現使用的策略文件與 java 2 實現的策略文件相似 — 除了每個授權語句必須與至少一個主體關聯在一起。javax.security.auth.policy 抽象類被用于表示 jaas 安全性策略。它的缺省實現由 com.sun.security.auth.policyfile 提供,在 com.sun.security.auth.policyfile 中策略定義在一個文件中。清單 3 是 jaas 策略文件的一個示例:
清單 3. 示例 jaas 策略文件
// example grant entry
grant codebase "file:/c:/sample.jar", signedby "xyz",
principal com.ibm.resource.security.auth.principalexample "admin" {
// allow socket actions to any host using port 8080
permission .socketpermission
"*:8080", "accept, connect, listen, resolve";
// allows file access (read, write, execute, delete) in
// the user's home directory.
permission java.io.filepermission
"${user.home}/-", "read, write, execute, delete";
};
這個示例與清單 1 中所示的標準 java 2 策略文件相似。實際上,唯一的不同是主體語句,該語句聲明只有擁有指定主體和主體名字的 subject(用戶)被授予指定的許可權。
再一次,使用系統屬性 java.security.auth.policy 指出 jaas 策略文件駐留在何處,如下所示:
java -djava.security.auth.policy=policy.jaas
subject 類包含幾個方法來作為特殊 subject 執行工作;這些方法如下所示:
public static object
doas(subject subject, java.security.privilegedaction action)