我期待到实现Spring的ACL为我们的项目,该项目是非常严格和细粒度的安全性要求。我想知道某种情况是否可能。春天ACL - 主/ SID不是用户,而是另一个实体
基于Spring的ACL文档,可以为ACL_SID授予任何对象(ACL_OBJECT_IDENTY),并且文档将SID作为“主体”来介绍..即当前登录的用户。如果我有四个部门(D1,D2,D3,D4)分配给两个经理(M1,M2),其中M1可以管理D1 & D2,M2可以管理D3和D4 ..我可以很容易地实施使用ACL。
现在,我有一种情况等,其中部门有员工,E1,E2 .... E8,(假设各两个序列中的每个部门..如D4具有E7和E8)。员工提交报告R *,我需要保护“读”这些报告访问: 1.员工本身。 2.员工的部门经理。 3.其他部门的员工。
和'admin'访问这些报告为: 1.员工本身 2.员工部门的经理。
即使这是可能通过访问控制列表,其中,A“主要”被限制到一个用户,像E *或M *的原始理解。如:
E1, E2.. E8
M1, M2..
,并为每个报表,我们可以创建ACL_ENTRY的一样:
R1 read, write to E1 //E1 is author
R1 read, write to M1 //M1 is manager of D1, and E1 belongs to D1
R1 read to E2 //E2 belongs to D1
在这种情况下,我会检查是否有E *或M *访问R1。
一切正常,但我觉得这可能太复杂而难以管理(ACL项),如果E的进出D的,或者如果M的添加/删除管理D'秒。
所以,问题是:我可以用一个实体对象作为校长,并用它来验证权限时,权限需要进行评估。因此,我可以添加到ACL_SID如下:
D1, D2, D3 and D4 //departmetnIds, not usersIds
然后将其替换ACL_ENTRIES:
R1 read, write to E1 //E1 is author
R1 read to D1 // note D1 here
这样一来,如果我检查读取任何E,我去检查一下R1是如果我正在检查是否有任何E有'写',那么我可以检查专门写入到E.
注意:虽然上面举了一个例子,我知道有一个以查看是否有任何M有'写入'权限。如果我们使用M的D来解析R1的权限的M本身,我们只会得到'read'..并且如果我们为D添加'写入'ACL_ENTRIES,那么M中的所有其他E都会'写'(如果不是的话) 。假设,这是我的情况的一个问题,请考虑更高一级的问题。
问题再次出现:ACL_SID中的主体/ SID总是必须是userId/userName还是可以是其他任何可以不同解释的东西?
在此先感谢。 M.宁可
只是看看多到什么是由一名首席预期,我们在java.security.Principal中的API找到这个: 公共接口主要 此接口表示主体的抽象概念,它可以用来表示任何实体,例如个人,公司和登录ID。 所以,从理论上讲,'D'(Department)可能是一个委托人。 ?? – 2011-04-06 17:28:03