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