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"