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