3

将 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 而不会影响域对象。

4

1 回答 1

0

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

于 2013-02-15T17:30:06.243 回答