【发布时间】:2017-08-26 16:48:07
【问题描述】:
这个代表例子:
有一个管理员用户A和一个普通用户B。
A 可以看到和改变 x,y,z。
B 可以看到 x,y(不是 z)并改变 x(不是 y,z)只有当 z 有一定的值时。
public class U{
private Long id;
private String x;
private String y;
private String z;
[... getter and setter]
}
问题是如何使用 Spring Data Rest 来实现这一点。 ResourceProcessor 似乎只适用于链接,验证器无法查看用户是否更改了字段...
我已经实现了一个基于属性的访问控制,所以我可以创建和保存角色、权限和策略(使用 SpEl),它们可以轻松地确定谁可以查看和更改数据库中的特定字段。
更新 1
我已经添加了Jackson BeanSerializerModifier 来过滤属性,但是存在的问题是我不知道z 的原始(数据库)值,并且无法检查B 是否有权更改x。
更新 2
我添加了一个自定义 Jackson Std(De)Serializer,但现在我不能动态地为每个实体使用它,因为我必须为每个实体编写完整的 (de)serializer。
更新 3
经过两周多次尝试解决此问题均未成功,我将尝试将过滤器集成到 SDR 中。
更新 4
虽然我为 PUT 和 PATCH 请求添加了过滤器,但我认为 https://jira.spring.io/browse/DATAREST-373 和 https://jira.spring.io/browse/DATAREST-428 会是更好的解决方案。现在我要为他们寻找解决方案。
【问题讨论】:
-
为什么不为这样的逻辑创建自定义控制器和服务?
-
因为我必须对每个实体(10 个实体并不断增长)都这样做,这意味着许多不必要的冗余代码。
标签: spring-boot spring-security jackson spring-data-rest spring-hateoas