2010-02-12 41 views
3

连接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。

+0

我在想你是否有这个工作?我正在实施同样的事情(例如,我自己的ACL服务),并且正在考虑相同的选择。我有一个问题,你如何保护你的服务方法?注释? AOP?或每个服务方法开始时的传统代码。 还有额外的经验教训? – HDave 2010-05-25 14:42:50

回答

0

spring security acl实现自带缓存内置,一旦缓存被加热,如果你通过spring-security注解强制实现,那么你将检索acl的方式主要针对给定的对象实例,因此你不会真的命中n + 1问题,而且它是基于jdbc的。
虽然域对象类名称的更改可能会成为一个问题,但这里acl_class表存储的是类身份,并且应该相当小,以便对其进行管理,因为该级别的重构发生在生产系统的主要版本之间。 Spring-security acl实现是以非侵入式方式快速实现acl实现的合理选择(即,ur域模型仍然不确定安全性,这主要是应用层关注的问题)。