如何将 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 与受保护的资源连接起来?的主要内容,如果未能解决你的问题,请参考以下文章

Objective-C - 私有与受保护与公共

将 WordPress iOS 应用程序与受 Shibboleth 保护的 WordPress 配合使用

受保护的内部属性与受保护的属性和 Resharper

公共与受保护

静态类与受保护的构造函数

ruby 公共与私人与受保护