Security 如何将ACL与受保护的资源连接?

Security 如何将ACL与受保护的资源连接?,security,spring-security,acl,Security,Spring Security,Acl,连接ACL和受保护资源的最佳方式是什么 1) 受保护的资源是否应该保留对其ACL的引用 interface AclHolder { Acl getAcl(); } 这很简单,但如果对象位于数据库中,则必须先构造它,然后才能检查访问权限 2) Spring安全性使用具有完全限定类名和对象id的机制从外部附加和检索ACL。这可能会导致n+1选择问题,因为根据特定标准无法选择多个ACL。如果在重构过程中更改类名,该系统可能会崩溃 3) 另一种方法是在ACL中存储对受保护资源的引用。通过延迟加

连接ACL和受保护资源的最佳方式是什么

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

interface AclHolder {
    Acl getAcl();
}
这很简单,但如果对象位于数据库中,则必须先构造它,然后才能检查访问权限

2) Spring安全性使用具有完全限定类名和对象id的机制从外部附加和检索ACL。这可能会导致n+1选择问题,因为根据特定标准无法选择多个ACL。如果在重构过程中更改类名,该系统可能会崩溃

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

class Acl<T> {
    @Lazy public T protectedResource;
    // acl methods ...
}
类Acl{
@懒惰的公众无法保护资源;
//acl方法。。。
}
4) 每个对象都可以有一个安全描述符(如在windows中):

类安全描述符{
公共Acl;
@懒惰的公众无法保护资源;
// ...
}
什么更好


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

spring security acl实现内置缓存,一旦缓存预热,如果通过spring安全注释强制实现,那么检索acl的方法主要是针对给定的对象实例,因此不会真正遇到n+1问题,而且它是基于jdbc的。

虽然域对象类名的更改可能是一个问题,但这里acl_类表也存储了类标识,并且应该相当小,以便在生产系统的主要版本之间进行该级别的重构时对其进行管理。Spring security acl实现是以非侵入方式快速实现acl的合理选择(即,您的域模型仍然不知道安全性,这主要是一个应用层问题)。

我想知道您是否曾经实现过此功能?我正在实现同样的事情(例如,我自己的ACL服务),并且正在考虑同样的选择。我的一个问题是如何保护您的服务方法?注释?AOP?或者在每个服务方法的开头使用传统代码。还有其他经验教训吗?
class SecurityDescriptor<T> {
  public Acl acl;
  @Lazy public T protectedResource;
  // ...
}