Java JPA:根据权限动态创建JPA查询
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java JPA:根据权限动态创建JPA查询相关的知识,希望对你有一定的参考价值。
我们有以下问题:
我们有2个不同的用户组,可以形成同意,而方法(例如getAllValues()
)应该只返回用户有权访问的值。
每个值都有一个时间戳,每个同意都有一个开始和结束时间。
在上面的情况中,当前用户应该获得他同意的所有用户的所有值。此外,他应该只在同意的时间跨度内收到价值。
Example
用户A同意用户B从2000-01-01
到2000-01-31
。用户B的值为1999-12-15
,2000-01-15
,2000-02-15
。用户A只应在调用getAllValues()
时收到2000-01-15的值。
我们已经找到了一种编写长SQL语句的方法,但它们很难读取和维护。现在我们正在寻找一种更好的方法来将Shiro或其他权限框架与JPA / Hibernate结合使用。
我们不想要的是查询所有值并在之后检查它们,因为这会产生很大的开销。
但到目前为止,我们唯一的解决方案是编写非常复杂的JPQL语句来实现这一目标。
是的,你应该使用外化授权框架,例如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
以上是关于Java JPA:根据权限动态创建JPA查询的主要内容,如果未能解决你的问题,请参考以下文章