我有一个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等框架。
答案 0 :(得分:1)
如果Shiro使用不同的方法,我无法回答,但正如Neil先前评论的那样,
Spring Security不提供任何特殊集成来自动创建,更新或删除ACL,作为DAO或存储库操作的一部分。相反,您需要为各个域对象编写代码
开源OACC security framework (披露:我是维护者和共同作者),另一方面有 创建权限<的概念/ strong> ,它允许您准确定义用户在创建对象后将获得的权限。
OACC是一种API,旨在帮助您以编程方式管理和查询权限和安全拓扑 它支持对单个域对象的细粒度权限,允许您对粗粒度角色进行建模,并使用 domains ,权限继承和模拟的概念进行建模,可以处理几乎任何事情。