2011-04-01 77 views
4

我期待到实现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.宁可

+0

只是看看多到什么是由一名首席预期,我们在java.security.Principal中的API找到这个: 公共接口主要 此接口表示主体的抽象概念,它可以用来表示任何实体,例如个人,公司和登录ID。 所以,从理论上讲,'D'(Department)可能是一个委托人。 ?? – 2011-04-06 17:28:03

回答

0

据我了解春季安全,完整的春季安全域与其他事情无关,所以PrincipalSidprincipal字符串可以是任何东西。

我唯一需要注意的地方就是ACL Entry的默认所有者始终是安全上下文的当前主体。

1

不,ACL_SID中的sid可能是您的系统支持的ROLE或其他GrantedAuthority。 例如,您可以为其所属的每个部门授予用户一个GrantedAuhtority。为了做到这一点,你需要实现你自己的UserDetailsS​​ervice。 在您的实现中,UserDetails.getAuthorities()将为每个部门/角色返回一个GrantedAuhtority元素。

相关问题