Spring Data Rest中的现场安全

ben*_*uly 5 spring-security jackson spring-data-rest spring-hateoas spring-boot

这个代表性例子:

有一个管理员用户A和一个正常用户B.

A可以看到并改变x,y,z.

只有当z具有特定值时,B才能看到x,y(不是z)并改变x(不是y,z).

public class U{
    private Long id;
    private String x;
    private String y;
    private String z;
    [... getter and setter]
}
Run Code Online (Sandbox Code Playgroud)

问题是如何通过Spring Data Rest实现这一点.ResourceProcessor似乎只适用于链接,而Validator无法查看用户是否更改了字段...

我已经实现了基于属性的访问控制,因此我可以轻松地在数据库中创建和保存角色,权限和策略(使用SpEl),以确定谁可以查看和更改特定字段.

更新1

我添加了一个Jackson BeanSerializerModifier来过滤属性,但是有一个问题是我不知道z的原始(数据库)值,并且无法检查B是否有权更改x.

更新2

我添加了一个自定义Jackson Std(De)Serializer,但现在我不能动态地将它用于每个实体,因为我必须为每个实体编写完整的(de)序列化器.

更新3

经过两周的努力尝试解决这个问题很多次,我将尝试将过滤器集成到SDR中.

更新4

当我为PUT和PATCH请求添加了一个过滤器时,我重新认识了https://jira.spring.io/browse/DATAREST-373https://jira.spring.io/browse/DATAREST-428将是更好的解决方案.现在我要为他们找到解决方案.

Ore*_*ron -1

也许您可以使用 @JsonView 来描述您可以从 DTO 读取什么和可以写入什么? http://www.baeldung.com/jackson-json-view-annotation

因此,您将拥有一种管理员视图和一种简单用户视图。