Java JPA : create JPA queries dynamically based on permissions

标签 java jpa authorization abac

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

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

在上面的例子中,当前用户应该得到他同意的所有用户的所有值。此外,他应该只在同意的时间范围内接收值。

例子

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

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

我们不希望查询所有值并在事后检查它们,因为这会产生大量开销。

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

最佳答案

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

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

后者对您来说最重要。

您的要求是:

In the case above, the current user should get all values of all users he has a consent with. Additionally he should only receive the values in the timespan of the consent.

在 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 : create JPA queries dynamically based on permissions,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48925258/

相关文章:

java - 使用纯 OpenGL 加载 PNG 文件

java - 如何在 JGROUPS 中禁用 FIFO 和重传协议(protocol)?

java - 我可以将循环作为参数传递给构造函数吗

java - 如何检查 session 是否是手动打开的?

mysql - 未定义的方法 `digest' 与 rails 4.0.1

java - 使用 java 配置 Api

JPA 坚持 OneToMany ManyToOne

java - JPA 组合键 @OneToMany

asp.net-mvc-3 - ASP.NET MVC 3 : How to get User's Role in a Controller Method?

security - Symfony2 授权 : Voters Vs. ACL