为了解决应用程序权限。Seam安全提供了一个可扩展的框架。下面的类图显式了权限框架的主要组件的概览:
这实际是一个接口,它提供了解决个别对象权限的方法。Seam提供了下列内建的PermissionResolver
实现,下面章节将详细描述它们:
RuleBasedPermissionResolver
首先需要在components.xml
中配置一个Drools规则库。缺省情况下,规则库名称为securityRules
,如下示例:
xmlns:core="http://jboss.com/products/seam/core"
xmlns:security="http://jboss.com/products/seam/security"
xmlns:drools="http://jboss.com/products/seam/drools"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=
"http://jboss.com/products/seam/core http://jboss.com/products/seam/core-2.1.xsd
http://jboss.com/products/seam/components http://jboss.com/products/seam/components-2.1.xsd
http://jboss.com/products/seam/drools http://jboss.com/products/seam/drools-2.1.xsd"
http://jboss.com/products/seam/security http://jboss.com/products/seam/security-2.1.xsd">
<drools:rule-base name="securityRules">
<drools:rule-files>
<value>/META-INF/security.drl</value>
</drools:rule-files>
</drools:rule-base>
</components>
缺省的规则库名称可以通过指定RuleBasedPermissionResolver
的security-rules
属性来重载:
安全规则文件应该包含些什么呢?这时至少浏览一下Drools文档是个不错的注意,不管怎样,先从一个极简单的例子开始:
import org.jboss.seam.security.permission.PermissionCheck;
import org.jboss.seam.security.Role;
rule CanUserDeleteCustomers
when
c: PermissionCheck(target == "customer", action == "delete")
Role(name == "admin")
then
c.grant();
end
让我们一步一步来看。我们首先看到的是包声明。在Drools中包本质上是一个规则的集合。这个包名你可以任意取──它不涉及规则基范围之外的任何东西。
接下来,我们注意到一些PermissionCheck
和Role
类的导入语句。这些导入信息告诉规则引擎在我们的规则中将引用这些类。
如果我们看规则的LHS部分,能看到列出了两个条件。我们先看看第一个条件:
这个条件标明工作内存中必须存在一个target
属性等于“customer”,并且action
属性等于“delete”的PermissionCheck
对象。
回到我们简单例子中,我们会注意到LHS的第一行有一个c:
前缀。这是一个变量绑定,用来引用匹配条件(本例中是PermissionCheck
)后返回的对象。再看LHS的第二行,我们看见:
no-loop
activation-group "permissions"
when
blog: MemberBlog()
check: PermissionCheck(target == blog, action == "create", granted == false)
Role(name == "user")
then
check.grant();
end
通过子你的规则中忽略PermissionCheck
的action
限制, 实现一个通配符许可检查(允许针对一个给定的许可目标的所有动作)也是可能的。像这样:
when
c: PermissionCheck(target == "customer")
Role(name == "admin")
then
c.grant();
end;
这个规则允许具有admin
角色的用户执行任何customer
许可检查的任何动作。