将 ACL 与 protected 资源连接起来的最佳方式是什么?
1) protected 资源是否应该持有对其 ACL 的引用?
interface AclHolder {
Acl getAcl();
}
这很简单,但是如果对象存在于数据库中,则必须先构造它才能检查访问权限。
2) Spring Security 使用一种具有完全限定类名和对象 ID 的机制来从外部附加和检索 ACL。这可能会导致 n+1 选择问题,因为多个 ACL 无法按特定标准进行选择。如果在重构时更改类名,则该系统可能会崩溃。
3) 另一种方法是在 ACL 中存储对 protected 资源的引用。通过延迟加载,可以在不从数据库加载 protected 资源的情况下检查 ACL。
class Acl<T> {
@Lazy public T protectedResource;
// acl methods ...
}
4) 每个对象都可以有一个安全描述符(就像在 Windows 中一样):
class SecurityDescriptor<T> {
public Acl acl;
@Lazy public T protectedResource;
// ...
}
什么更好?
临时解决方案:我将实现 AclHolder 接口(interface),因为域对象可以实现它,并且还可以在不影响域对象的情况下附加 ACL。
最佳答案
spring security acl 实现带有内置缓存,一旦缓存被加热,如果你通过 spring-security 注释强制实现,你检索 acl 的方式主要是针对给定的对象实例,因此你不会真正命中 n +1 问题,而且它是基于 jdbc 的。
虽然域对象类名称的更改可能是一个问题,但这里 acl_class 表也存储类标识,并且应该相当小以管理它,因为该级别的重构发生在生产系统的主要版本之间。 Spring-security acl 实现是以非侵入方式快速实现 acl 的合理选择(即,您的域模型仍然不知道安全性,这主要是一个应用程序层问题)。
关于security - 如何将 ACL 与 protected 资源连接起来?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2252966/