【问题标题】:Securing the domain object with Spring ACL 3使用 Spring ACL 3 保护域对象
【发布时间】:2015-09-08 05:28:46
【问题描述】:

我有一个 RESTful 服务,它使用内部业务服务来保存和从数据库中获取信息。 Web 服务 uri 类似于 /api/entity/{id},Web UI 应用程序使用实体的 ID 向其请求。这里的问题是{id} 可以是任何人的 id,即使用应用程序的用户不应该看到的其他人的记录。为了解决这个问题,使用 Spring Security,我写了一个 SPEL,类似于,

@Service
interface EntityService {
    @PostAuthorize("returnObject.userId==principal.id")
    public ReturnObject get(long i);
}

上述方法是解决这个问题的正确方法吗? (在我早期的项目中,我的开发人员过去常常将所有这些安全性内容写入他们的业务方法中。)例如,随着实体的安全性复杂性增加,用户的管理员(创建了记录)可以看到该对象,但其他管理员或组管理员不能看到记录等,这种方法太复杂了。 此外,在深入研究了许多 Spring-ACL 库类之后,我不知何故设法配置了 Spring-ACL,调用它的权限评估器评估 SPEL 中的 hasPermission 方法,并获得实体的授权及其唯一-从数据库加载的标识符。

@Service
interface EntityService {
    @PreAuthorize("hasPermission(#id, 'com.project.domain.ReturnObject', 'read')")
    public ReturnObject get(long id);
}

但是我看到这种方法的问题是,每次用户创建记录时,应用程序不应该也为该对象创建 ACL 权限(ACL_ENTRY)吗?这是解决这个问题的正确方法,还是我没有看到其他方法?我知道这不是一个新问题,应该已经有人以多种方式解决了它。我想知道问题是如何解决的,不是用传统的方式,服务逻辑或查询,而是使用 Spring-ACL 或 Apache Shiro 等框架。

【问题讨论】:

  • Spring Security 不会为您处理 acl_entry 创建,遗憾的是。你必须自己做那部分。

标签: java spring spring-security acl shiro


【解决方案1】:

如果 Shiro 使用不同的方法,我无法回答,但正如 Neil 之前评论的那样,

Spring Security 不提供任何特殊集成来自动创建、更新或删除 ACL,作为 DAO 或存储库操作的一部分。相反,您需要为您的各个域对象编写代码 [...]

——Spring Security Reference: Domain Object-based ACLs

开源OACC security framework(披露:我是维护者和合著者),另一方面有create-permissions的概念>,它可以让您准确定义用户在创建对象后将获得哪些权限。

OACC 是一种 API,旨在帮助您以编程方式管理和查询您的权限和安全拓扑。
它支持对您的各个域对象的细粒度权限,允许您对粗粒度角色进行建模,并使用其、权限继承模拟的概念em>,几乎可以处理介于两者之间的任何事情。

【讨论】:

  • 这是一个新消息,我正在寻找一些框架来评估并与 Spring-ACL 进行比较,将对此进行查看并根据我的要求进行评估并在此处更新结果。谢谢!
  • @VijayVeeraraghavan 那么,你的结论是什么?
猜你喜欢
  • 2019-07-18
  • 2011-12-05
  • 2016-07-12
  • 2016-08-17
  • 1970-01-01
  • 1970-01-01
  • 2013-09-09
  • 1970-01-01
  • 2015-06-12
相关资源
最近更新 更多