如何将自定义属性添加到 Olingo 中的元模型?
How to add custom attributes to the meta model in Olingo?
对于当前的项目,我们在 hibernate 之上使用 Olingo,并使用 picketlink 来实现安全性和角色。
具有不同角色的用户将具有不同的权限,这会影响对某些属性的读/写访问。考虑以下示例:
- 一个实体 "Person" 具有属性 "name"、"address" 和 "salary"
- 两个角色 - "Employee" 和 "Manager"
虽然员工应该能够编辑自己的地址,但他当然不能更改自己的薪水或其他人的地址。虽然他可能被允许查看自己的薪水和其他用户的地址,但他甚至不能看到其他人的薪水,更不用说编辑了。另一方面,经理拥有完全的读写权限。
这在后端不是问题 - 我们可以在那里使用自定义 bean 验证来强制执行写入权限。
但我希望前端能够反映用户权限 - 例如通过禁用 "salary" 文本字段或首先不显示它。
为此,我想将基于用户权限的自定义属性引入到 oData 元模型中。而不是
<Property Name="Address" Type="Edm.String" Nullable="false"/>
我想收到
<Property Name="Address" Type="Edm.String" Nullable="false" Mode="readwrite"/>
或类似的东西。
所以问题是:如何使用 Olingo 将自定义属性引入到我的 oData 元模型中?
请不要把上面的例子看得太严重。我确实意识到,简单地友好地告诉界面不要通过元模型显示其他人的薪水本质上是不安全的;)
更新:
好吧,没那么容易。我现在意识到了。我之前提到的属性在 CDSL 中称为 "facets"(oData 依赖于此(双关语意)),事实证明,有一组固定的方面类型。因此,Olingo 在这里不太关心抽象,您会发现很多硬编码的东西。我想仍然可以添加另一种刻面类型,但这需要在很多地方接触 Olingo。而且它会消除与 CDSL / oData 的一致性——我不太关心这一点,但这可能解释了缺乏解决问题的办法。
现在看来我要么尝试引入另一个方面,要么截取并修改传出的 xml。
我对这两个选项都不太热心,所以...任何关于更好解决方案的提示仍然非常受欢迎!
事实证明这实际上非常容易。
Olingo 将允许您通过实施 JPAEdmExtension 及其方法 extendJPAEdmSchema 来扩展架构。详细了解 here。
这应该可以让你继续,但我会在不久的将来尝试提供一个例子。
对于当前的项目,我们在 hibernate 之上使用 Olingo,并使用 picketlink 来实现安全性和角色。
具有不同角色的用户将具有不同的权限,这会影响对某些属性的读/写访问。考虑以下示例:
- 一个实体 "Person" 具有属性 "name"、"address" 和 "salary"
- 两个角色 - "Employee" 和 "Manager"
虽然员工应该能够编辑自己的地址,但他当然不能更改自己的薪水或其他人的地址。虽然他可能被允许查看自己的薪水和其他用户的地址,但他甚至不能看到其他人的薪水,更不用说编辑了。另一方面,经理拥有完全的读写权限。
这在后端不是问题 - 我们可以在那里使用自定义 bean 验证来强制执行写入权限。
但我希望前端能够反映用户权限 - 例如通过禁用 "salary" 文本字段或首先不显示它。
为此,我想将基于用户权限的自定义属性引入到 oData 元模型中。而不是
<Property Name="Address" Type="Edm.String" Nullable="false"/>
我想收到
<Property Name="Address" Type="Edm.String" Nullable="false" Mode="readwrite"/>
或类似的东西。
所以问题是:如何使用 Olingo 将自定义属性引入到我的 oData 元模型中?
请不要把上面的例子看得太严重。我确实意识到,简单地友好地告诉界面不要通过元模型显示其他人的薪水本质上是不安全的;)
更新:
好吧,没那么容易。我现在意识到了。我之前提到的属性在 CDSL 中称为 "facets"(oData 依赖于此(双关语意)),事实证明,有一组固定的方面类型。因此,Olingo 在这里不太关心抽象,您会发现很多硬编码的东西。我想仍然可以添加另一种刻面类型,但这需要在很多地方接触 Olingo。而且它会消除与 CDSL / oData 的一致性——我不太关心这一点,但这可能解释了缺乏解决问题的办法。
现在看来我要么尝试引入另一个方面,要么截取并修改传出的 xml。
我对这两个选项都不太热心,所以...任何关于更好解决方案的提示仍然非常受欢迎!
事实证明这实际上非常容易。
Olingo 将允许您通过实施 JPAEdmExtension 及其方法 extendJPAEdmSchema 来扩展架构。详细了解 here。
这应该可以让你继续,但我会在不久的将来尝试提供一个例子。