【发布时间】: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