如何使用受保护资源连接ACL?

时间:2010-02-12 15:44:14

标签: security spring-security acl

将ACL与受保护资源连接的最佳方法是什么?

1)受保护资源是否应该保留对其ACL的引用?

interface AclHolder {
    Acl getAcl();
}

这很简单,但如果对象存在于数据库中,则必须先构建它,然后才能检查访问权限。

2)Spring Security使用一个具有完全限定类名和对象id的机制来从外部附加和检索ACL。这可能导致n + 1选择问题,因为某个标准无法选择多个ACL。如果类名在重构时发生变化,则该系统可能会中断。

3)另一种方法是在ACL中存储对受保护资源的引用。使用延迟加载,可以在不从数据库加载受保护资源的情况下检查ACL。

class Acl<T> {
    @Lazy public T protectedResource;
    // acl methods ...
}

4)每个对象都可以有一个安全描述符(如在windows中):

class SecurityDescriptor<T> {
  public Acl acl;
  @Lazy public T protectedResource;
  // ...
}

什么更好?

临时解决方案:我将实现AclHolder接口,因为域对象可以实现它,并且还可以在不影响域对象的情况下附加ACL。

1 个答案:

答案 0 :(得分:0)

spring security acl实现带有内置缓存,一旦缓存被加热,如果你通过spring-security注释强制实现,你去检索acl的方式主要是针对给定的对象实例,因此你真的没有找到n +1问题,而且它是基于jdbc的。
虽然更改域对象类名称可能是一个问题,但是这里acl_class表也存储了类标识,并且应该相当小以管理它,因为在生产系统的主要版本之间发生了该级别的重构。 Spring-security acl实现是以非侵入方式实现快速acl实现的合理选择(即,您的域模型仍然与安全性无关,主要是应用层关注)。