java學習心得筆記

name="com.ibm.security.sample.bid"

actions="write"

relationship="owner" />;

<permission classname=

"com.ibm.resource.security.auth.resourcepermission"

name="com.ibm.security.sample.bid"

actions="accept"

relationship="actionowner" />;

</principal>;

</grant>;

</policy>;

在這個示例策略檔案中,任何與名為 principalexample 的用戶有關的用戶(subject)都可以創建並讀取一個 auction.class 實例。但是,只有創建該實例的用戶才可以更新(寫)它。這是第三個 permission 元素定義的,該元素包含值為 owner 的 relationship 屬性。bid.class 實例也是一樣,除了相應 auction.class 實例的所有者可以更改投標接受標誌。

resource 接口

要求類實例級訪問控制的類必須實現 resource 接口。該接口的 getowner() 方法返回類實例的所有者。fulfills(subject subject, string relationship) 方法被用於處理特定關係。另外,這些類使用 com.ibm.resource.security.auth.resourcepermission 類保護敏感代碼。例如,auction 類擁有下列構造函式:

public auction() {

permission permission =

new resourcepermission("com.ibm.security.sample.auction", "create");

accesscontroller.checkpermission(permission);

}

所有者關係

resourcepermission 類的 implies(permission p) 方法是這個框架的關鍵。implies() 方法就等同性比較名稱和行為屬性。如果定義了一個關係,那么必須把受保護的類實例(resource)傳遞到 resourcepermission 構造函式中。resourcepermission 類理解所有者關係。它將類實例的所有者與執行代碼的 subject(用戶)進行比較。特定關係被委託給受保護類的 fulfills() 方法。

例如,在清單 5 中所示的 xml 策略檔案中,只有 auction 類實例的所有者可以更新(寫)檔案。該類的 setter 方法使用清單 6 中顯示的保護代碼:

清單 6. 運行中的 implies(permission) 方法

public void setname(string newname) {

permission permission =

new resourcepermission("com.ibm.security.sample.auction", "write", this);

accesscontroller.checkpermission(permission);

// sensitive code

this.name = newname;

}

被傳遞到 resourcepermission 構造函式中的 this 引用代表 auction 類實現的 resource 接口。由於策略檔案中列出的關係是 owner,所以 resourcepermission 類使用這個引用檢查當前 subject(用戶)是否擁有與實例所有者相匹配的主體。如果指定了另一個關係,那么 resourcepermission 類調用 auction 類的 fulfills(subject subject, string relationship) 方法。由 resource 實現類提供 fulfills() 方法中的邏輯。

xml 策略檔案中列出的 bid 類擁有清單 7 中所示的方法(假設 bid 類實例有一個對相應 auction 類實例的引用 — auction)。

清單 7. 處理特定關係

public void setaccepted(boolean flag) {

permission permission =

new resourcepermission("com.ibm.security.sample.auction", "accept", this);

accesscontroller.checkpermission(permission);

// sensitive code

this.accepted = flag;

}

public boolean fulfills(subject user, string relationship) {

if( relationship.equalsignorecase("auctionowner") ) {

string auctionowner = auction.getowner();

iterator principaliterator = user.getprincipals().iterator();

while(principaliterator.hasnext()) {

principal principal = (principal) principaliterator.next();

if( principal.getname().equals(auctionowner) )

return true;

}

}

return false;

}

傳遞到 fulfills() 方法中的關係字元串是策略檔案中列出的關係。在這個案例中,我們使用了“auctionowner”字元串。

預設情況下,xmlpolicyfile 類在當前工作目錄中查找名為 resourcepolicy.xml 的檔案。系統屬性 com.ibm.resource.security.auth.policy 可以用於指定另一個不同的檔案名稱和位置。

websphere application server 示例

除命令行示例之外,您可能還想運行這個簡單的程式,該程式為了 ibm websphere application server,version 4.0.2 而被最佳化。

一個可運行的示例

綜合這些信息,我們將運行一個簡單的命令行示例。該示例程式包含三個 jar 檔案:

resourcesecurity.jar

example.jar

exampleactions.jar

resourcesecurity.jar 檔案包含允許實例級訪問控制的 jaas 擴展框架。它還包含一個 loginmoduleexample 類,這個類從 xml 檔案讀取用戶認證信息。用戶標識和密碼存儲在 users.xml 檔案中。用戶組存儲在 groups.xml 檔案中。關於 loginmoduleexample 的更多信息,請參閱參考資料部分。