Seam中基于ACL的权限控制(1)

Seam框架已经能够解决大多数web程序开发中会遇到的问题。通过提供一系列基于“最佳实践”总结出的统一模型,开发人员的web程序的开发工作变得非常轻松。程序员在开发具体的相关业务逻辑的时候,就不会再郁闷了,因为大多数功能在Seam中都有对应的模块来实现。例如,Seam生成PDF、发送email、实现国际化等,都非常方便。同时,Seam还集成了许多第三方框架,例如Drools、jBPM等,这些框架写作能够实现非常复杂的业务逻辑以及跨度时间很长的流程操作。其他还支持自动生成验证码、wiki风格的标记语言和一大堆AJAX功能。

其中最重要的企业特性之一,就是Seam的权限控制部分。Seam包含一个非常健全的安全认证API,通过这个API,一个典型的程序中需要用到的组件和视图安全认证都能够实现。Seam通过用户角色以及基于规则的权限控制来实现安全控制。最近的版本中(2.1.0GA),Seam重写了安全引擎,提供了大量新的相关功能来保障敏感数据的安全。本文就来看看其中一个新的特性——权限的持久化,着重于介绍ACL或者说是基于实例的安全机制是如何在对象级别保障你程序的安全的。

开始之前,让我们先来看看基于规则的与基于ACL的安全控制有什么不同。基于规则的安全控制擅长于将一堆权限授予某个对象。例如下面这段规则代码(来自于Seam的示例项目):

Drools代码

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 
  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记录的对象是实体的实例,而不是文件。通常情况下,这个对象为实体,不过我们将会看见,它可以应用到所有类型的对象上。

你可能感兴趣的:(框架,Ajax,jbpm,企业应用,seam)