【发布时间】:2016-04-10 02:11:35
【问题描述】:
我已经实现了一个带有一些复杂授权要求的 REST 应用程序。
总结一下
我的客户购买了一个名为 Collector 的代理设备,它可以集中他们的家庭自动化控制。我的客户还购买了多个家庭自动化设备(我们称之为 HADevices),这些设备通过收集器将他们的指标报告给我的 REST 应用程序。
具有角色 ROLE_ADMIN 的管理员(我的客户服务代表)应该能够查看来自任何收集器或 HADevice 的任何数据。具有 ROLE_USER 角色的客户应该只能查看有关收集器或他/她拥有的 HADevice 的数据。
具有角色 ROLE_COLLECTOR 的收集器是唯一有权插入数据的角色,即在我的 REST 服务中创建或更新资源。我们将此 URL 称为 /deviceMetrics (POST)。收集器可以插入与客户关联的任何 HADevice 的指标。 HADevices 没有角色,也不与我的 REST 应用程序交互。收集器只能将记录插入与收集器具有相同客户的 HADevices。
我使用 spring security 4.0 进行身份验证,使用 @Secured 注解进行授权。但是,我发现我的代码中充斥着重复的权限验证,这些验证占据了我的大部分逻辑。基本的插入和检索非常简单。
我想使用 PermissionEvaluator 来集中访问控制。我必须保护以下网址
- GET /collectors/{id}/deviceMetrics - 我从 委托人并验证我春天中 id={id} 的收集器 数据存储库属于委托人,如果不是,我发送 403
- GET/hadevices/{id}/deviceMetrics - 我从 委托人并验证我的 spring 数据中 id={id} 的 HADevice 存储库属于委托人,如果不是,我发送 403。
- POST /collectors/{id}/deviceMetrics - 我检索收集器 uniqueId 从 Principal 获取并确保 Collector 的 id 与 网址中的 {id}
- POST /hadevice/{id}/deviceMetrics - 我检索 来自 Principal 和关联客户的收集器 uniqueId。一世 还使用 id={id} 拉取与 HADevice 关联的客户和 比较两者。如果它们不相等,我会发送 403。
我的应用程序对每个 REST 资源都有如此复杂的授权要求,我想使用自定义的 org.springframework.security.access.PermissionEvaluator,特别是通过实现以下方法。
boolean hasPermission(Authentication authentication, Serializable targetId, String targetType, Object permission)
我打算结合使用 targetType 和 request.getUrl() 来为每个 url 和资源获取一个专门的 Evaluator。 有没有更好的方法来做到这一点?
【问题讨论】:
标签: java spring rest spring-security acl