security - 如何将 ACL 与 protected 资源连接起来?

标签 security spring-security acl

将 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/

相关文章:

python - 如何在传输过程中保护 REST API 负载?

ruby - 如何在 Ruby 中设置和使用 SHA1 哈希

java - Spring Security 中的每个请求都从数据库中重新加载 UserDetails 对象

spring-boot - Spring Security OAuth2 是否支持带有 PKCE 的浏览器(Angular)客户端的授权代码流?

session - 我怎样才能获得所有开放的 session ?

ios - 无法在 swift 中删除 Parse 对象 - ACL 问题?

.net - 将基于 ECC 的证书从 Windows 证书存储导入 CngKey

java - 忽略 spring mvc 中的安全注释

php - 为我的 PHP 应用程序实现 ACL

model-view-controller - CakePHP中基于ACL修改 View