扩展JAAS实现类实例级授权
?
SecurityManager 对 AccessController
在标准 JDK 分发版中,控制代码源访问的机制缺省情况下是关闭的。在 Java 2 平台以前,对代码源的访问都是由?SecurityManager
类管理的。?SecurityManager
?是由?java.security.manager
?系统属性启动的,如下所示:
?
认识您的主体
Subject
?类被用于封装一个被认证实体(比如用户)的凭证。一个?Subject
?可能拥有一个被称为?主体(principal)的身份分组。例如,如果?Subject
?是一个用户,用户的名字和相关的社会保险号可能是?Subject
?的某些身份或主体。主体是与身份名关联在一起的。
Principal
?实现类及其名称都是在 JAAS 策略文件中指定的。缺省的 JAAS 实现使用的策略文件与 Java 2 实现的策略文件相似 ― 除了每个授权语句必须与至少一个主体关联在一起。?javax.security.auth.Policy
?抽象类被用于表示 JAAS 安全性策略。它的缺省实现由com.sun.security.auth.PolicyFile
?提供,在?com.sun.security.auth.PolicyFile
?中策略定义在一个文件中。清单 3 是 JAAS 策略文件的一个示例:
清单 3. 示例 JAAS 策略文件
?
这个示例与清单 1 中所示的标准 Java 2 策略文件相似。实际上,唯一的不同是主体语句,该语句声明只有拥有指定主体和主体名字的 subject(用户)被授予指定的许可权。
再一次,使用系统属性?java.security.auth.policy
?指出 JAAS 策略文件驻留在何处,如下所示:
?
在这个示例策略文件中,任何与名为?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
?类拥有下列构造函数:
结束语
类实例级授权把访问控制分离到一个通用框架(该框架使用基于所有权和特定关系的策略)中。然后管理员可以在应用程序的生命周期内更改这些策略。用这种方法扩展 JAAS 减少了您或另一个程序员必须在应用程序生命周期内业务规则发生更改时重写代码的可能性。
通过将关系字符串抽象为类可以进一步扩展特定关系这个概念。不调用?Resource
?实现类的?fulfills(Subject user, String relationship)
?方法,而只要调用?Relationship
?实现类中定义的新?fulfills(Subject user, Resource resource)
?方法。这样就会允许许多?Resource
?实现类使用相同的关系逻辑。