Java JPA:根据权限动态创建JPA查询

问题描述 投票:2回答:1

我们有以下问题: 我们有2个不同的用户组,可以形成同意,而方法(例如getAllValues())应该只返回用户有权访问的值。

每个值都有一个时间戳,每个同意都有一个开始和结束时间。

在上面的情况中,当前用户应该获得他同意的所有用户的所有值。此外,他应该只在同意的时间跨度内收到价值。

Example

用户A同意用户B从2000-01-012000-01-31。用户B的值为1999-12-152000-01-152000-02-15。用户A只应在调用getAllValues()时收到2000-01-15的值。

我们已经找到了一种编写长SQL语句的方法,但它们很难读取和维护。现在我们正在寻找一种更好的方法来将Shiro或其他权限框架与JPA / Hibernate结合使用。

我们不想要的是查询所有值并在之后检查它们,因为这会产生很大的开销。

但到目前为止,我们唯一的解决方案是编写非常复杂的JPQL语句来实现这一目标。

java jpa authorization abac
1个回答
0
投票

是的,你应该使用外化授权框架,例如Apache Shiro,Spring Security或Axiomatics Policy Server。

您真正需要的是基于属性的访问控制,您可以在其中定义用户可以根据其属性(包括角色),对象或资源的属性,操作和上下文属性(时间,日期,地点...)。

后者对你最重要。

您的要求是:

在上面的情况中,当前用户应该获得他同意的所有用户的所有值。此外,他应该只在同意的时间跨度内收到价值。

在ALFA(授权的缩写语言)中,要求变为以下规则:

 policy consentAccess{
     target clause com.acme.action.actionId=="view" and com.acme.object.objectType=="consent"
     apply firstApplicable
     rule allowUsers{
         permit
         condition com.acme.consent.date==com.acme.allowedConsents.date
     }
 }

然后,可以通过Axiomatics数据访问筛选器将此策略动态转换为SQL筛选器。这意味着您不再需要了解SQL或了解如何编写查询。

HTH

© www.soinside.com 2019 - 2024. All rights reserved.