对于当前的项目,我们在 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中称为“方面” (oData 位于其上(双关语)),事实证明,有一组固定的方面类型。因此,Olingo 在这里并没有过多关注抽象,而是会发现很多硬编码的东西。我想仍然可以添加另一种构面类型,但这需要在许多地方触摸 Olingo。而且它会消除与 CDSL / oData 的一致性——我不太关心,但这可能解释了缺乏解决问题的方法。
现在看来我必须尝试引入另一个方面,或者拦截和修改传出的 xml。
我对这两种选择都不感兴趣,所以......任何关于更好解决方案的提示仍然非常受欢迎!