连接ACL和受保护资源的最佳方式是什么?如何将ACL与受保护资源连接?
1)受保护的资源是否应该保存对其ACL的引用?
interface AclHolder {
Acl getAcl();
}
这很简单,但是如果对象存在于数据库中,它必须在可以检查访问权限之前构建。
2)Spring Security使用具有完全限定类名和对象标识的机制来附加并从外部检索ACL。这可能会导致n + 1选择问题,因为多个ACL无法通过某个标准进行选择。如果在重构期间类名改变,该系统可能会中断。
3)另一种方法是在ACL中存储对受保护资源的引用。通过延迟加载,可以在不从数据库加载受保护资源的情况下检查ACL。
class Acl<T> {
@Lazy public T protectedResource;
// acl methods ...
}
4)每个对象可以在窗口一个安全描述符(像):
class SecurityDescriptor<T> {
public Acl acl;
@Lazy public T protectedResource;
// ...
}
什么是好?
临时解决方案:由于域对象可以实现它,所以我将实现AclHolder接口,并且还可以在不影响域对象的情况下附加ACL。
我在想你是否有这个工作?我正在实施同样的事情(例如,我自己的ACL服务),并且正在考虑相同的选择。我有一个问题,你如何保护你的服务方法?注释? AOP?或每个服务方法开始时的传统代码。 还有额外的经验教训? – HDave 2010-05-25 14:42:50