示例 jaas 策略文件
// example grant entry
grant codebase "file:/c:/sample.jar", signedby "xyz",
principal com.ibm.resource.security.auth.principalexample "admin" {
// allow socket actions to any host using port 8080
permission java.net.socketpermission
"*:8080", "accept, connect, listen, resolve";
// allows file access (read, write, execute, delete) in
// the user's home directory.
permission java.io.filepermission
"${user.home}/-", "read, write, execute, delete";
};
这个示例与清单 1 中所示的标准 java 2 策略文件相似。实际上,唯一的不同是主体语句,该语句声明只有拥有指定主体和主体名字的 subject(用户)被授予指定的许可权。
再一次,使用系统属性 java.security.auth.policy 指出 jaas 策略文件驻留在何处,如下所示:
java -djava.security.auth.policy=policy.jaas
subject 类包含几个方法来作为特殊 subject 执行工作;这些方法如下所示:
public static object
doas(subject subject, java.security.privilegedaction action) 3 4 5 6 7 8 9 10 11 12 13 14 15
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 策略文件 |
|