- 浏览: 255438 次
- 性别:
- 来自: 南京
文章分类
最新评论
-
xuhuan1108:
请问必须都是主键吗?@PrimaryKeyJoinColumn ...
用@SecondaryTable实现多表联合到一个实体 -
renwanly:
共享一下,还是注册服务是王道:http://vboxvmser ...
让VirtualBox的虚拟机器在电脑开机时自动启动 -
liuyuantp:
结果取整。
计算总页数算法 -
jespring:
当数据量很大的时候,在建索引过程中,电脑挂了后,再继续建索引, ...
第28章、Hibernate Search -
meteormatt:
我试了下,怎么会不能用?
Eclipse更新站点
Seam框架已经能够解决大多数web程序开发中会遇到的问题。通过提供一系列基于“最佳实践”总结出的统一模型,开发人员的web程序的开发工作变得非常轻松。程序员在开发具体的相关业务逻辑的时候,就不会再郁闷了,因为大多数功能在Seam中都有对应的模块来实现。例如,Seam生成PDF、发送email、实现国际化等,都非常方便。同时,Seam还集成了许多第三方框架,例如Drools、jBPM等,这些框架写作能够实现非常复杂的业务逻辑以及跨度时间很长的流程操作。其他还支持自动生成验证码、wiki风格的标记语言和一大堆AJAX功能。
其中最重要的企业特性之一,就是Seam的权限控制部分。Seam包含一个非常健全的安全认证API,通过这个API,一个典型的程序中需要用到的组件和视图安全认证都能够实现。Seam通过用户角色以及基于规则的权限控制来实现安全控制。最近的版本中(2.1.0GA),Seam重写了安全引擎,提供了大量新的相关功能来保障敏感数据的安全。本文就来看看其中一个新的特性——权限的持久化,着重于介绍ACL或者说是基于实例的安全机制是如何在对象级别保障你程序的安全的。
开始之前,让我们先来看看基于规则的与基于ACL的安全控制有什么不同。基于规则的安全控制擅长于将一堆权限授予某个对象。例如下面这段规则代码(来自于Seam的示例项目):
rule DeleteImage no-loop activation-group "permissions" when acct: MemberAccount() image: MemberImage(mbr : member -> (mbr.memberId.equals(acct.member.memberId))) check: PermissionCheck(target == image, action == "delete", granted == false) then check.grant(); end
这段规则做了这么一个限制:让用户有权限删除他之前上传的图片。其中最重要的部分限制了,只有图片的所有者才能删除图片。在这个例子中,该权限加在所有图片上,并且在图片和其所有者之间拥有一种连接关系。通过这条关系,安全规则能够决定当前用户即为该图片的所有者,并且将相应的权限授予其执行操作。不过,如果在需要检查的对象的权限如果与当前用户没有关联呢?(在这里,用户就是只principal)这样就需要ACL了。
ACL(访问控制表)记录了某个指定的对象与某个权限之间的一一对应关系。每个记录都拥有一个接受者(被授予权限的用户principal)和一个操作。如果你使用过unix系列的操作系统,那么你就会对ACL非常熟悉了,unix操作系统有一个表格用来记录某个用户对某个文件的修改、删除或执行权限。当然Windows也有这样的机制,不过Windows并没有表现出他是这样控制的。Seam中的ACL也是一样的,唯一不同的就是,Seam中ACL记录的对象是实体的实例,而不是文件。通常情况下,这个对象为实体,不过我们将会看见,它可以应用到所有类型的对象上。
当我们为对象指定权限的时候,我们需要先来做点准备工作。其中最重要的,就是为我们的权限准备一个存储方式。Seam提供了一个PermissionStore接口,这个接口中定义了各种基于ACL的对象权限管理方法。理论上,权限的存储方式可以为所有可能的方式,例如文件、LDAP等等。不过通常,我们都用关系数据库来存储。所以Seam提供了一个PermissionStore的实现——JpaPermissionStore,它使用JPA来管理存储在数据库中的权限。要想使用JpaPermissionStore,我们需要做两件事情,第一是写一个Entity,来映射管理数据库中的权限记录,第二是在component.xml中添加相应的配置文件。
Seam提供一组专用于权限的注解,用来将Entity中的属性与数据库中的字段对应起来。下面这段代码为配置权限Entity的最简情况(为了版面简介,这里省略了所有的getter与setter):
@Entity public class AccountPermission implements Serializable { @Id @GeneratedValue public Integer permissionId; @PermissionUser @PermissionRole public String recipient; @PermissionTarget public String target; @PermissionAction public String action; @PermissionDiscriminator public String discriminator; }
@PermissionUser与@PermissionRole注解用来指定权限的接受者。在这里,我们用一张表来管理角色的权限与人员的权限,所以我们将这两个注解加到同一个属性上。同时,为了做到这一点,我们需要一个专门的字段来当作辩析器,指明这条权限是针对角色的还是针对用户的,我们将@PermissionDiscriminator加到另外一个属性上,就能将一个字段变为辩析器。最后,我们需要一个字段来指明权限适用的对象(@PermissionTarget)与权限的操作(@PermissionAction)。
下面我们需要在components.xml文件中添加相应的配置了,添加这个配置信息,目的是为了启用JpaPermissionStore:
<security:jpa-permission-store user-permission-class="com.acme.AccountPermission" />
现在我们配置也做了,Entity也写了,下面我们就可以开始分配权限了。Seam提供了一个组件,叫做PermissionManager,帮助我们完成权限管理方面的工作。PermissionManager里面的方法与PermissionStore接口里面的非常类似,实际上它也是将大多数工作递交给底层的PermissionStore实现,唯一不同的地方就是,它在执行相关操作之前,会先检查一下当前用户是否拥有该操作所对应的权限。更多相关的内容,请参考Seam的文档。然而,不是所有用户都有权管理权限的,必须要有相关的授权才可以。
让我们来授予用户第一个权限!假设程序里面有一个customer表,对应的Entity为Customer,你需要将不同客户的资料管理权限授予不同的销售人员。加入你需要张三去管理你最好的客户——李四(对应的客户编号为1234)。我们将客户李四资料的维护权限授予张三的代码会是下面这样:
PermissionManager.instance().grantPermission(new Permission(entityManager.find(Customer.class, 1234), "update", new SimplePrincipal("bob")));
PermissionManager的实例会调用grantPermission()方法来将新的权限生成一条记录,然后保存进数据库。这个操作会自动递交给你配置的JpaPermissionStore来执行(当然,这个操作首先会检查当前用户是否有权进行)。我们来看一下这个操作在AccountPermission产生了什么效果:
AccountPermission ================= RECIPIENT TARGET ACTION DISCRIMINATOR ----------------------------------------------- bob Customer:1234 update user
我们可以从数据库查询结果中很显然地看到,这条权限的接受者是bob,对象是编号为1234的Customer,操作是更新,并且这条对象是授权给bob这个用户而不是某个名叫bob的角色,因为辨别器中写的是user而不是role。
其中target的值比较有意思,我们可以看见,这个字段的值有两个部分,冒号前面的部分是对象的名称Customer,而冒号后面为对象的ID。在Entity中,Seam可以自动生成对象的ID。
但是,如果我们需要记录的权限对象不是一个实体,而是其他的类,那么就需要让Seam知道如何来生成针对某个任意对象的唯一标识符。我们可以添加@Identifier到相应的类上,并且添加一个实现了IdentifierStrategy接口的类。例如:
@Identifier(CustomIdentifierStrategy.class) public class MyNonEntityClassThatIWantToAssignPermissionsTo { public String getUniqueProperty() { return foo; } }
IdentifierStrategy也非常简单,只要实现两个方法就可以了。canIdentify()在IdentifierStrategy能够为指定的类生成唯一标识符的时候返回true,getIdentifier() 则为指定的对象返回生成的唯一标识符。例如,Seam内置实现的EntityIdentifierStrategy类就是为某个Entity生成一个调用对象编号的name。
public class CustomIdentifierStrategy implements IdentifierStrategy { public boolean canIdentify(Class targetClass) { return targetClass.equals(MyNonEntityClassThatIWantToAssignPermissionsTo.class); } public String getIdentifier(Object target) { return ((MyNonEntityClassThatIWantToAssignPermissionsTo) object).getUniqueProperty(); } }
还有值得一提的,你也可以为某个字符串常量指定权限。例如,权限的对象不一定非要是Entity或者某个类。PermissionManager同样也很乐意接受一个简单的字符串作为权限对象,因为有可能你需要的一个权限,仅仅是你根据需要任意指定的一个权限而已。对于一个普通的类,你就可以这么做,例如你想针对一个类创建一条权限,名叫“创建”,然后用这个权限来限制用户能否创建一个类的实例(new ClassName的方式)。不过你无法创建一个基于类的权限去作用于一个不存在的类。
通过上面介绍的这些,你已经可以通过Seam内置的权限管理模块来对你程序里涉及到的权限进行控制了。具体的在Seam官方文档里面有介绍。
下一篇文章我们将会一起来探讨,权限相关的操作是如何定义并且存储的。并且我也会介绍一下如何创建用户体验良好的权限管理界面,来简化权限管理方面的操作。
敬请期待
发表评论
-
ERROR [TomcatDeployment] ENC setup failed
2009-11-21 02:16 2003通常这个问题出现在persistence.xml文件有问题的时 ... -
Seam下载文件的问题
2009-08-11 18:24 1409Seam默认下载文件会变成直接在网页中打开内容,主要是因为Re ... -
利用seam-gen来将Seam身份认证管理系统加入到你的项目中
2009-03-20 09:52 1249最近几个月我已经塞了一大堆功能到seam-gen中去了。在我刚 ... -
rich:dataTable中链接传参数不起作用的问题
2009-03-10 17:08 2777经常在一个dataTable里面的放一列,内容是对该条记录的操 ... -
Seam中使用@In @create @Logger需要注意的地方
2009-03-07 17:34 1900以下是我做的一些试验,之所以做这些试验,还是因为我对Seam的 ... -
在JBoss Seam中使用GWT
2009-02-04 18:04 1946原文地址:http://dev.ymeng.net/integ ... -
seam项目实例
2009-01-16 03:42 1239http://www.daying.gov.cn/ ... -
Seam Bean验证快速进阶II:自定义约束
2009-01-16 03:41 949Seam Bean验证快速进阶II:自定义约束 由于百度空间不 ... -
在Jboss Seam中使用PojoCache 和Page Fragment Cache
2009-01-16 03:40 892图片见:http://hi.baidu.com/stenlyl ... -
扩展seam组件
2009-01-16 03:38 1361任何一个框架都必须拥 ... -
seam发送邮件email示例
2009-01-16 03:37 2088以下转自csdn上的一个回答,留着用的时候参考,防止到时找不到 ... -
deleted entity passed to persist
2009-01-16 03:36 5830该错误很可能出现在如下情况: Role和Permission为 ... -
Seam中 EntityHome的remove方法需要加@End声明Conversation结束
2009-01-16 03:36 1157原文:http://seam.group.iteye.com/ ... -
Seam与OpenLDAP的集成(一)
2009-01-16 03:12 1164原文地址:http://shane.bryzak.com/bl ... -
Seam启动流程
2009-01-16 03:08 1156检测包含seam.properties或/META-INF/c ... -
我在seam官网提的问题
2009-01-16 02:51 10351、How to grant permissions with ... -
Hibernate Search, Lucene 与 JBoss Seam
2008-09-28 17:36 891原文地址:http://www.abstractec.c ...
相关推荐
NULL 博文链接:https://solodu.iteye.com/blog/466780
SEAM 中文开发指南(官方)
seam 中文文档 pdf 格式 JSF+EJB3.0快速开发框架Seam的中文版向导。。。
个人收集整理的最全面seam文档 包括seam_reference(中、英) richfaces jsf a4j 以及seam一些其他主要功能
Seam 中文开发指南 seam中文文档
• 身份管理 - 用于管理Seam程序中所涉及的用户及角色的接口 • 权限验证 - 一个应用十分广泛的权限验证框架,支持用户角色、持久化和基于规则的权限设置,能够灵活地实现属于用户自己的安全设置 • 权限管理 - 一组...
JBOSS SEAM组件中文手册 Seam_2.0_Reference_zh_CN
seam下一代web开发框架
seam in action 中文 english seam提供了快速开发 好长。netjava 新手学习的利器 中英文各一本,英文的好像不是很好
seam框架需要的所有jar包,支持seam ui组件
Seam2[1][1].0中文参考手册
整理自jboss seam 中文站,压缩为chm格式,便于广大jboss seam爱好者阅读,所有版权归jboss seam中文站所有。
seam资料seam资料seam资料seam资料seam资料seam资料seam资料seam资料
JBoss_Seam--中文、Seam教程,中文Seam针对初学者很好的讲解及实例。希望对您有所收获。
Seam为 应 业务业业 义 种统 组 你的 用程序中所有的 定 了一 一的 件模型。 Seam组件可能是 态义 关关 态 有状 的,包含与几个定 良好的上下文中任何一个相 的状 , 包括长开间运行上 下文、持久化上下文、业务流程...
1.Matlab可以直接运行的源码实现,功能结构,代码清晰易读 2.可以帮助理解代码以及相应的实现原理 3.能实现基于SeamCarving算法的图像放大和缩小
seam_carving代码实现 图像缩放
非常好的jboss-seam入门资料,基于较新的seam2.0版本。来源到自带的实例分析
Seam在JAAS和JBoss规则之上,创建了一个新的基于规则的安全框架。甚至有用来渲染PDF、在线电子邮件和图表及wikitext的JSF标签库。 Seam组件可以同时作为一个Web Service进行调用,异步地从客户端JavaScript或者...
内容去除:指定一个矩形的内容,将该矩形内容从原图像中删除,并且尽可能保持其余部分维持原有形状。 而第五部分则包含两个方面的实验尝试与结果: 1.结合其他算法重新评估像素重要性并生成能量图,观察图像剪裁...