如何将 ACL 与受保护的资源连接起来?
Posted
技术标签:
【中文标题】如何将 ACL 与受保护的资源连接起来?【英文标题】:How to connect ACLs with protected resources? 【发布时间】:2011-01-16 05:08:54 【问题描述】:将 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 而不影响域对象也是可能的。
【问题讨论】:
我想知道你是否有过这个工作?我正在实现同样的事情(例如我自己的 ACL 服务)并且正在考虑同样的选择。我的一个问题是您如何保护您的服务方法?注释?奥普?或每个服务方法开头的传统代码。有什么额外的经验教训吗? 【参考方案1】:spring security acl 实现带有内置缓存,一旦缓存被加热,如果你通过 spring-security 注释强制实现,你检索 acl 的方式主要是针对给定的对象实例,因此你不会真正命中 n +1 问题,而且它是基于 jdbc 的。 虽然域对象类名称的更改可能是一个问题,但这里 acl_class 表也存储类标识,并且应该相当小以管理它,因为该级别的重构发生在生产系统的主要版本之间。 Spring-security acl 实现是以非侵入方式快速实现 acl 的合理选择(即,您的域模型与主要是应用层关注的安全性无关)。
【讨论】:
以上是关于如何将 ACL 与受保护的资源连接起来?的主要内容,如果未能解决你的问题,请参考以下文章