15.6.8. 权限验证的模型(The Permission Authorization Model)seam security提供了一个可扩展的应用程序权限解析框架。下面的类图展现了权限验证框架的主要组件:
上图中涉及到的类,将在后面的章节中详细介绍。
15.6.8.1. PermissionResolver组件这个组件实际上是一个接口。提供了解析某个对象权限的方法。Seam提供了下面两个内置的PermissionResolver实现。后面的章节中会详细介绍它们。
- RuleBasedPermissionResolver - 这个权限解析器使用Drools来解析基于规则的权限验证。
- PersistentPermissionResolver - 这个权限解析器用来解析持久化的对象权限,例如将权限存储在数据库中。
15.6.8.1.1. 编写你自己的PermissionResolver自定义权限解析器非常简单。PermissionResolver接口只定义了两个必须实现的方法,这两个方法列举在下面的表格中。
表 15.7. PermissionResolver接口
- boolean hasPermission(Object target, String action):这个方法必须要判断出当前被验证的用户(通过Identity.getPrincipal()获得)是否拥有权限来对target进行某个action。如果返回true,那么当前用户拥有权限,反之返回false
- void filterSetByAction(Set<Object> targets, String action):这个方法应该实现将任意对象从指定的set中删除,以便当传入相同的action参数值的时候能够让hasPermission()方法返回true。
当你将自定义的权限解析器部署到你的项目中去的时候,它就会自动检查并注册到默认的解析器组中去。
15.6.8.2. 权限解析链ResolverChain一个权限解析链(ResolverChain)包含了一组有序的权限解析器(PermissionResolver),因此它能够解析某一特定class或者target的权限。
下面的程序表(sequence diagram)展现了在权限验证过程(流程说明)中,各权限组件是如何互相配合工作的。一个权限验证的时间有可能来自各种不同的情况,例如,通过安全拦截器、EL表达式s:hasPermission、或是显式调用Identity.checkPermission接口:
- 1. 在某个地方触发了权限验证事件(在代码中或者EL表达式中),调用到了Idengity.hasPermission()方法。
- 1.1. Identity引用PermissionMapper.resolvePermission()方法,传入需要被解析的权限。
- 1.1.1. PermissionMapper提供一个ResolverChain实例的Map,key为class。通过这个map为权限的target对象寻找一个正确的ResolverChain。
一旦找到正确的ResolverChain,就会调用ResolverChain.getResolvers()将所有的PermissionResolver重新检索出来
- 1.1.2. PermissionMapper会为ResolverChain中的每一个PermissinResolver调用一次hasPermisson()方法,传入需要被检验的权限实例。一旦任何一个PermissionResolver返回了true,权限验证就成功并且PermissionMapper也返回true给Identity。如果没有一个PermissionResolver返回true,权限验证就失败。
15.6.9. RuleBasedPermissionResolverRuleBasedPermissionResolver作为seam内置的一个权限解析器,支持基于Drools(JBoss Rules)规则的权限判断机制。基于规则的权限验证解析器有两个重要的原因
1)、将权限验证的业务逻辑与其他部分分离,全部集中到规则文件中,便于维护与修改
2)、速度——Drools的规则判断与执行内核拥有非常高效的算法,能够让非常复杂的规则判断更加快速。
15.6.9.1. 需求(Requirement)如果使用基于规则的权限判断机制,那么以下几个包必须发布到你的项目中去:
drools-compiler.jar
drools-core.jar
janino.jar
antlr-runtime.jar
mvel14.jar
15.6.9.2. 配置首先,Drools规则系统需要在components.xml文件中配置一下。默认情况下,会去找叫做securityRules的规则。例如下面这段配置:
Xml代码
<components xmlns="http://jboss.com/products/seam/components"
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>
<components xmlns="http://jboss.com/products/seam/components" 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属性来指定。
Xml代码
<security:rule-based-permission-resolver security-rules="#{prodSecurityRules}"/>
<security:rule-based-permission-resolver security-rules="#{prodSecurityRules}"/>
一个RuleBase的组件已经配置好,现在是时候来写一些安全规则了。
15.6.9.3. 编写权限规则编写权限规则的第一件事就是要在你程序jar包所在路径/META-INF下面创建一个规则文件。通常这个文件被取名为类似security.drl。不过你可以随意给他取名,只要这个名字在components.xml文件中能对的上号。
那么,安全规则文件到底需要包含哪些内容呢?首先我们应该快速浏览一下Drools的文档。我们先从一个及其简单的例子来分析:
Xml代码
package MyApplicationPermissions;
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
package MyApplicationPermissions; 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里面的package实际上是一组规则的集合。包名你可以任意取,因为这里的包名仅仅针对这些规则文件有效。
接下来需要注意的就是import PermissinCheck与Role对象。这两句告诉规则引擎后面需要用到这两个对象。
最后就轮到规则检查语句了。通常一个包里面的每一条规则都会被起一个名字,这个名字经常用规则的目的来取名。这里我们的规则名为CanUserDeleteCustomers。这个规则是用来判断一个用户能否删除一条客户记录。
分享到:
相关推荐
seam 2.1 GA 最新版出来了! Seam 2.1打算支持Wicket。作为第一选择的显示层,这包含着一些技术细节:我们所作的是让你能够明显的通过Wicket使用Seam组件,从Wicket内部类中使用Annotations,能够控制你的业务进程...
seam2.1文档,这里面的seam2.1,比seam2.0的权限验证多了很多的东西.
才翻译完成的2.1的。。。。。 jboss seam 2.1用户手册中文版
• 权限验证 - 一个应用十分广泛的权限验证框架,支持用户角色、持久化和基于规则的权限设置,能够灵活地实现属于用户自己的安全设置 • 权限管理 - 一组内置的Seam组件,能让应用程序的安全政策变得容易管理 • ...
Seam 是一种业级 企 Java 的应规用程序框架。它的灵感源自下列原 : 只有一种“工具” Seam为 应 业务业业 义 种统 组 你的 用程序中所有的 定 了一 一的 件模型。 Seam组件可能是 态义 关关 态 有状 的,包含与几...
基于Seam2.1的最新力作《Seam Framework: Experience the Evolution of Java EE, 2nd Edition》By: Jacob Orshalick , Michael Juntao Yuan, Thomas Heute February 2009 (Safari Shortcut - June 2008)
基于Seam2.1的最新力作《Seam Framework: Experience the Evolution of Java EE, 2nd Edition》的摘要部分,有8页,让你快速了解Core Seam By: Jacob Orshalick , Michael Juntao Yuan, Thomas Heute February 2009 ...
jboss seam开发框架2.1.2版本最新开发参考
整理自jboss seam 中文站,压缩为chm格式,便于广大jboss seam爱好者阅读,所有版权归jboss seam中文站所有。
seam中的注解总结,包括三种JPA和seam自身的标签
NULL 博文链接:https://solodu.iteye.com/blog/466780
所有Seam组件都需要该注解。 @Scope @Scope(ScopeType.CONVERSATION) 定义默认的组件上下文。可以定义的值由 ScopeType 枚举:EVENT, PAGE, CONVERSATION, SESSION, BUSINESS_PROCESS, APPLICATION, STATELESS。
Jboss seam 详细注解。供大家参考学习。
Seam - 语境相关的组件[满江红20071230]............................................................................................................................ 1 Java EE 框架...........................
由开源组织满江红翻译,本人整理成PDF格式
很好的资源文档 seam是一个深度集成的框架,在注解方面也有很多的亮点
seam_carving代码实现 图像缩放
* 不需要配置文件,只要把JARs文件放到类路径里面,添加 @Path 注解就可以了。 * 完全的把 RESTEeasy 配置作为Seam 组件来看待。 * HTTP 请求由Seam来提供,不需要一个额外的Servlet。 * Resources 和providers...
seam in action seam in action seam in action seam in action seam in action seam in action seam in action
SeamCarving的C++实现代码,使用opencv库。包含完整项目工程及测试图像,可直接使用