spring security acl,security acl 3000
缝合一直致力于解决网面临的常见问题
应用程序开发人员。通过提供一系列"最佳实践"
在统一组件中解决各种开发挑战
模型中,开发人员可以自由地处理他们的业务逻辑
应用程序,而不必担心
应该由框架正确处理接缝。让这变得非常容易
做一些事情,比如生成便携文档格式文档,生成和发送电子邮件,
并国际化您的应用程序。它还集成了第三代
jBPM和流口水等项目为长的提供支持
运行业务流程和业务规则。支持验证码,
和维基网风格的标记语言,以及许多
创建交互式、快速动态网页应用的网页开发技术的使用方法。
企业最重要的领域之一
应用程序开发虽然是安全的接缝。早就提供了
健壮的安全应用程序接口允许典型的
应用程序由通过用户和角色安全性来保护的组成,或者
基于规则的安全权限。但是最近(从版本
接缝对其安全引擎进行了全面检查,以提供一个数字
的新功能提供了更多的方法来保护您的敏感数据。
本文将研究这些新特性中的一个,持久性
查看如何使用基于前十字韧带或"实例"的安全性的权限
在对象级别保护您的应用程序。
为了开始,
让我们来看看基于规则和基于前十字韧带的区别
安全。基于规则的安全性非常适合应用覆盖
特定类别对象的权限。例如,让我们举一个例子
请看下面一个缝合示例中的安全规则:
规则删除图像
无回路
激活-组权限
当.的时候
账户:会员账户()
图像:成员图像(MBR:成员-(MBR。memberid。等于(帐户。成员。memberid)))
check:权限检查(target==image,action==delete ,granted==false)
然后
检查。grant();
目标
这
此规则的条件部分(允许用户删除
他们之前上传的)实际上是在说,"如果你是
这个图像,然后你可以删除它。在此示例中
安全许可适用于所有图像,并且取决于以下事实
图像和它的所有者之间有一种关系。这是
通过这种关系,安全规则可以确定
当前用户是图像的所有者,并依次授予以下权限
执行操作。然而,如果没有关系
权限检查的目标和用户(我们称之为
校长从这里开始)?这就是前十字韧带安全性的用武之地。
一;一个
ACL(访问控制列表)是分配给的显式权限列表
一个特殊的物体。列表中的每个条目都包含一个收件人(即
被授予许可的当事人)和一个动作。如果你曾经
使用基于*nix的操作系统,那么您应该已经很熟悉了
对于特定类型的ACL,文件系统包含一个
对每个文件的读、写和执行权限(是的,Windows有
类似的文件安全性,但不太明显)。中基于前十字韧带的安全性
缝合的工作方式非常相似,只是它是用来保护对象的
实例而不是文件。在典型应用中,这些对象
实例通常是实体,但是我们很快就会看到它是
可以保护任何类型的物体。
在开始为对象分配权限之前,我们首先
需要做一点准备。最重要的是我们需要一个地方
存储实际权限本身接缝。提供了
权限存储接口,该接口声明
管理前十字韧带对象权限。虽然理论上有可能
将权限存储在任何类型的永久存储中(例如,在文件中,在
轻量级目录访问协议等)通常使用关系数据库最有意义。
为此,接缝附带了一个名为
JpaPermissionStore,它允许将权限存储在数据库中
使用JPA .要使用JpaPermissionStore,我们需要做两件事;创造
一个实体豆来保存权限记录,并对其进行配置
缝合的component.xml中的实体豆子.
一组特殊的注释用于配置
实体表示权限的各个方面。下面的代码
展示了一个最简单的例子(为了简洁起见,注释
显示在字段上,getter/setter方法被省略):
@实体
公共类帐户权限实现可序列化
{
@Id @GeneratedValue公共整数permissionId
@PermissionUser @PermissionRole公共字符串收件人;
@PermissionTarget公共字符串目标;
@PermissionAction公共字符串操作;
@PermissionDiscriminator公共字符串鉴别器;
}
这
@PermissionUser和@PermissionRole批注指示该属性
包含权限接收者的。在这个例子中,我们是
使用单个表来保存用户和角色权限,所以我们将
收件人字段上的两个注释——因为我们是
在同一个表中存储两种类型的权限,我们还需要一个
鉴别器(用@PermissionDiscriminator注释)属性因此
这个接口可以告诉用户哪些条目是用户的,哪些是用户的
角色。最后,我们需要一个属性来存储权限目标
(用@PermissionTarget注释)和一个权限属性
动作(用@PermissionAction注释)。
一旦我们有了
创建了我们的实体,我们只需要配置JpaPermissionStore来
通过将以下条目添加到缝合的components.xml来使用它
配置文件:
安全性:JPA-permission-store用户-权限-/
现在
我们已经创建并配置了权限存储实体,我们可以
开始分配权限接缝。的安全应用程序接口提供了一个方便的
名为权限管理器的组件,它允许我们轻松地管理
对象权限。它的方法看起来与
权限存储接口,事实上它们本质上委托给
但是底层的权限存储有一个小小的限制
每个被调用的许可相关操作首先被检查
确保调用用户拥有调用的必要权限
那次行动。更多细节可以在缝合中找到
参考指南,但是可以说不是任何用户都可以
管理对象权限,他们必须首先拥有所需的权限
这样做。
让我们第一次批准吧!想象一下你的应用程序
包含一个客户表(由名为
客户),并且您希望授予某些的更新权限
顾客对你的各种销售人员。假设你想
允许销售人员上下移动管理您的最佳客户的详细信息
琼斯帐户(碰巧客户身份为1234)。我们同意
允许上下移动通过调用以下内容来管理该客户
方法:
PermissionManager.instance().授予权限(新权限(entitymanager。找到(客户。类,1234),
update ,新的简单主体( bob );
在…里
这样,权限管理器将委托授予权限()
调用已配置的JpaPermissionStore(在验证
当前用户具有这样做的必要特权)和新的
将在数据库中创建权限记录。让我们分开一段时间
查看帐户权限表中究竟写入了什么:
帐户权限
=================
收件人目标操作鉴别器
-
鲍勃客户:1234更新用户
这里
从列值中我们可以明显地看到,收件人是
“鲍勃”,动作是"更新",鉴别器是"用户"(因为
上下移动是用户,不是角色)。目标列的内容是一个
更有趣一点。此处显示的值称为
对象标识符,用于唯一标识特定的
对象的实例。在这种情况下,讨论中的目标是一个
对我们来说幸运的是缝合已经知道如何生成独特的
实体的对象标识符。但是,如果
权限不是一个实体,而是某个其他类型的类的实例
那么缝合必须被告知如何为此生成一个对象标识符
班级。这是通过在类中添加@标识符注释来实现的
,并指定识别策略的实现
像这样:
@ Identifier(customidentifierstrategy。类)
公共类mynonentityclassthathiwanttassignpermissions到{
公共字符串getUniqueProperty(){ return foo;}
}
这
识别策略接口极其简单,只声明了两个
方法。如果
识别策略实现能够生成
指定类的标识符和getIdentifier()方法
返回指定对象的唯一标识符字符串。为
例如,所包含的EntityIdentifierStrategy策略实现
有接缝通过连接名称来生成实体的标识符
实体的身份属性。
下面是一个实现的示例:
公共类自定义标识符策略实现标识符策略{
public boolean可以识别(类目标类){
返回目标阶层。等于(mynonentityclassthathiwanttassignpermissions to。类);
}
公共字符串获取标识符(对象目标){
返回((mynonentityclassthathiwanttoassignpermissions to)对象)。getUniqueProperty();
}
}
它
还值得一提的是,可以为
文字字符串常量。也就是说,许可目标并不总是
要求是实体或其他对象实例。这
权限管理器将很乐意允许您针对
字符串文字,如果您需要维护一组
任意权限。这同样适用于类,例如,如果你
喜欢为某个类分配"创建"权限,那么它就是
可能做到这一点(显然不可能分配"创建"
对象实例尚不存在时的权限)。
一次
所有的部分都就位了,你可以使用标准的机制
由缝合提供,用于保护视图和中的对象
动作组件(有关更多信息,请参见缝合参考指南)。
在…里
在下一篇文章中,我们将更详细地讨论许可的方式
行动可以被定义和存储,也看我们如何创造
权限管理视图可以更方便地管理我们的对象
权限通过一个漂亮的用户界面。
转自:http://java.dzone.com/articles/acl-security-in-seam?page=0,0
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。