如何在Olingo中向元模型添加自定义属性?

时间:2015-04-24 21:08:27

标签: java hibernate odata olingo

对于当前项目,我们在hibernate之上使用Olingo,并为安全性和角色使用picketlink。

具有不同角色的用户将具有不同的权限,这会影响对某些属性的读/写访问权限。请考虑以下示例:

  • 一个具有“名称”,“地址”和“薪水”属性的实体“人”
  • 两个角色 - “员工”和“经理”

虽然员工应该能够编辑自己的地址,但他当然不能改变他的工资或其他人的地址。虽然他可能被允许看到自己的薪水和其他用户的地址,但他不会被允许甚至看到别人的薪水,更不用说编辑了。另一方面,经理具有完全的读写权限。

这在后端不是问题 - 我们可以在那里使用自定义bean验证来强制执行写权限。

但我希望前端能够反映用户权限 - 例如,通过禁用“薪水”文本字段或不首先显示它。

为此,我想将基于用户权限的自定义属性引入oData元模型。而不是

<Property Name="Address" Type="Edm.String" Nullable="false"/>

我想收到

<Property Name="Address" Type="Edm.String" Nullable="false" Mode="readwrite"/>

或者同样的效果。

所以问题是:如何使用Olingo将自定义属性引入我的oData元模型?

请不要把上面的例子太严肃了。我确实认识到简单地告诉界面不要通过元模型显示其他人的工资本身就是不安全的;)

更新

好吧,这并不容易。我现在意识到了。我之前提到的属性在CDSL中被称为“facets”(oData依赖于它(双关语)),事实证明,有一组固定的facet类型。因此,Olingo在这里不会对抽象感到烦恼,你会发现许多硬编码的东西。我想仍然可以添加另一个facet类型,但这需要在许多地方触摸Olingo。它会消除与CDSL / oData的一致性 - 我不会太在意,但这可能解释了该问题缺乏解决方案。

现在看起来我不得不尝试引入另一个方面,或者拦截并修改传出的xml。

我不会对任何一种选择都充满热情,所以...任何提示更好的解决方案仍然会受到欢迎!

1 个答案:

答案 0 :(得分:-1)

事实证明它实际上非常很容易。

Olingo将允许您通过实现JPAEdmExtension及其方法extendJPAEdmSchema来扩展架构。详细了解here

这应该可以帮到你,但我会在不久的将来尝试提供一个例子。