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 的更多信息,請參閱參考資料部分。