java學習心得筆記
public static object
doas(subject subject, java.security.privilegedaction action)
throws java.security.privilegedactionexception
注意,用來保護敏感代碼的方法與“java 2 代碼源訪問控制”(java 2 codesource access control)概述中描述的方法相同。請參閱參考資料部分以了解更多關于 jaas 中代碼源訪問控制和認證的信息。
jaas 中的授權
清單 4 顯示一個授權請求的結果,該請求使用清單 3 中顯示的 jaas 策略文件。假設已經安裝了 securitymanager,并且 logincontext 已經認證了一個帶有名為“admin”的 com.ibm.resource.security.auth.principalexample 主體的 subject。
清單 4. 一個簡單的授權請求
public class jaasexample {
public static void main(string[] args) {
...
// where authenticateduser is a subject with
// a principalexample named admin.
subject.doas(authenticateduser, new jaasexampleaction());
...
}
}
public class jaasexampleaction implements privilegedaction {
public object run() {
filewriter fw = new filewriter("hi.txt");
fw.write("hello, world!");
fw.close();
}
}
這里,敏感代碼被封裝在 jaasexampleaction 類中。還要注意,調用類不要求為 jaasexampleaction 類代碼源授予許可權,因為它實現了一個 privilegedaction。
擴展 jaas
大多數應用程序都有定制邏輯,它授權用戶不僅僅在類上執行操作,而且還在該類的實例上執行操作。這種授權通常建立在用戶和實例之間的關系上。這是 jaas 的一個小缺點。然而,幸運的是,這樣設計 jaas 使得 jaas 可以擴展。只要做一點工作,我們將可以擴展 jaas,使其包含一個通用的、類實例級的授權框架。
在文章開頭處我已經說明了,抽象類 javax.security.auth.policy 被用于代表 jaas 安全性策略。它的缺省實現是由 com.sun.security.auth.policyfile 類提供。policyfile 類從 jaas 格式的文件(象清單 3 中顯示的那個一樣)中讀取策略。
我們需要向這個文件添加一個東西為類實例級授權擴展策略定義:一個與許可權語句相關的可選關系參數。
缺省 jaas 許可權語句的格式如下:
permission <permission implementation class>; [name], [actions];
我們在這個許可權語句的末尾添加一個可選的關系參數來完成策略定義。下面是新許可權語句的格式:
permission <permission implementation class>;
[name], [actions], [relationship];
在為類實例級授權擴展 jaas 時要注意的最重要的一點是:許可權實現類必須有一個帶三個參數的構造函數。第一個參數是名稱參數,第二個是行為參數,最后一個是關系參數。
解析新文件格式
既然文件格式已經改變,就需要一個新的 javax.security.auth.policy 子類來解析文件。
為簡單起見,我們的示例使用了一個新的 javax.security.auth.policy 子類 com.ibm.resource.security.auth.xmlpolicyfile,來從 xml 文件讀取策略。在實際的企業應用程序中,關系數據庫更適合執行這個任務。
使用 xmlpolicyfile 類代替缺省的 jaas 訪問控制策略實現的最容易的方法是向 java.security 屬性文件添加 auth.policy.provider=com.ibm.resource.security.auth.xmlpolicyfile 條目。java.security 屬性文件位于 java 2 平臺運行時的 lib/security 目錄下。清單 5 是與 xmlpolicyfile 類一起使用的樣本 xml 策略文件:
清單 5. 一個 xml 策略文件
<?xml version="1.0"?>;
<policy>;
<grant codebase="file:/d:/sample_actions.jar">;
<principal classname=
"com.ibm.resource.security.auth.principalexample" name="users">;
<permission classname=
"com.ibm.resource.security.auth.resourcepermission"
name="com.ibm.security.sample.auction"
actions="create" />;
<permission classname=
"com.ibm.resource.security.auth.resourcepermission"
name="com.ibm.security.sample.auction"
actions="read" />;
<permission classname=
"com.ibm.resource.security.auth.resourcepermission"
name="com.ibm.security.sample.auction"
actions="write"
relationship="owner" />;
<permission classname=
"com.ibm.resource.security.auth.resourcepermission"
name="com.ibm.security.sample.bid"
actions="create" />;
<permission classname=
"com.ibm.resource.security.auth.resourcepermission"
name="com.ibm.security.sample.bid"
actions="read" />;
<permission classname=
"com.ibm.resource.security.auth.resourcepermission"