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 的更多信息,请参阅参考资料部分。 |
|