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.0 版本,Seam 2.1 在权限验证方面进行了大量的增强,引入了更多的功能和改进,以适应更加复杂的应用场景。 #### 二、Seam 2.1 的新增特性与改进 在 Seam 2.1 中,最显著的变化之一就是增强了安全性...
- **Annotation的支持**:Seam 2.1支持在Wicket内部类中使用注解,这为开发者提供了更多的灵活性来组织代码结构。 - **业务流程管理**:通过Seam 2.1,开发者可以在Wicket应用中更好地控制业务流程管理任务,例如...
总的来说,Seam 2.1 的安全模块框架提供了一套强大且灵活的工具,涵盖了从身份验证到权限管理的全过程,帮助开发者构建安全的 Java 应用程序。通过其丰富的 API 和组件,开发者可以快速定制和集成各种安全策略,确保...
### 基于Seam2.1的最新力作《Seam Framework: Experience the Evolution of Java EE, 2nd Edition》全书知识点概览 #### 一、Seam框架简介 Seam框架是JBoss组织推出的一个开源项目,旨在简化企业级应用开发,通过...
此外,还可以使用Seam的`@Restrict`注解进行更细粒度的控制。 3. **数据库设计**:为了实现基于数据库的权限管理,我们需要设计一个包含用户、角色和权限关系的数据库模型。通常,会有一个`User`表存储用户信息,一...
Seam 是一种业级 企 Java 的应规用程序框架。它的灵感源自下列原 : 只有一种“工具” Seam为 应 业务业业 义 种统 组 你的 用程序中所有的 定 了一 一的 件模型。 Seam组件可能是 态义 关关 态 有状 的,包含与几...
### JBoss Seam 2.1版本开发参考知识点 #### 一、JBoss Seam 框架简介 **JBoss Seam** 是一个企业级Java Web应用框架,它简化了基于Java平台的应用程序开发过程。该框架提供了强大的上下文管理功能、会话管理、...
- **实现**:通过集成Spring Security等第三方库来实现权限验证和访问控制等功能。 - **优势**:易于集成和配置,能够快速为应用程序添加安全特性。 ##### Application Framework - **概述**:Seam框架不仅限于Web...
- `<s:form>`: 是Seam提供的增强版的JSF表单标签,它可以自动处理Seam组件的绑定和验证。 - `<s:in>` 和 `<s:out>`: 分别用于注入和输出Seam组件。它们类似于EL表达式,但在某些情况下,如在JSF的EL无法解析时,...
### jboss-seam 注解详解 #### @Name 在JBoss Seam框架中,`@Name`注解主要用于定义一个Seam组件。为了确保组件能够被正确识别与使用,每个Seam组件都必须拥有一个唯一的名称标识,即通过`@Name`来指定。例如: `...
整理自jboss seam 中文站,压缩为chm格式,便于广大jboss seam爱好者阅读,所有版权归jboss seam中文站所有。
### Seam注解详解 #### 一、Seam框架概述与注解的重要性 Seam作为一款功能强大的企业级应用开发框架,其核心理念在于提供一种高度集成化的开发方式,旨在简化复杂的业务逻辑处理流程,使开发者能够更加专注于业务...
### JBoss Seam 注解详解 #### 一、`@Name`与`@Scope` - **`@Name`**: 此注解用于标识一个类作为Seam组件,并为其定义一个名称,例如`@Name("componentName")`。这是所有Seam组件的必备注解。 - **`@Scope`**: ...
Seam和Hibernate是两个在Java开发中非常重要的框架。Seam是一个全面的、集成的Java EE框架,主要用于简化企业级应用的开发,而Hibernate则是一个强大的对象关系映射(ORM)框架,它允许开发者用Java对象来操作数据库...
### Seam Framework 2.0 Reference中文版知识点梳理 #### JBoss Seam 概述 JBoss Seam 是一款基于 Java 的企业级应用开发框架,它简化了应用程序的开发过程,特别是那些涉及复杂的用户交互、业务逻辑以及数据处理的...
例如,Seam引入了`@Name` 注解,允许在没有JavaBeans约定的情况下为组件命名,以及`@Factory` 注解,用于创建组件的工厂方法。 **5. 事件处理** Seam的事件模型允许组件间异步通信。使用`@Create`、`@Destroy`等...
在安全方面,Seam支持身份验证和授权,可以轻松地集成到已有的安全框架,如JAAS(Java Authentication and Authorization Service)。它还提供了对富客户端应用的支持,比如AJAX功能,这使得Web应用能够实现更丰富的...
Seam - 语境相关的组件[满江红20071230]............................................................................................................................ 1 Java EE 框架...........................
通过使用 Seam的注解驱动编程,如`@Name`和`@In`,可以轻松地注入依赖,使得代码更加简洁和可读。 Seam还包含了强大的事件模型,允许组件之间通过发布和监听事件来通信。例如,一个组件可以通过`EventContext`发布...