Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring boot Spring数据Rest中的字段安全性_Spring Boot_Spring Security_Jackson_Spring Data Rest_Spring Hateoas - Fatal编程技术网

Spring boot Spring数据Rest中的字段安全性

Spring boot Spring数据Rest中的字段安全性,spring-boot,spring-security,jackson,spring-data-rest,spring-hateoas,Spring Boot,Spring Security,Jackson,Spring Data Rest,Spring Hateoas,这个有代表性的例子: 有一个管理员用户A和一个普通用户B A可以看到并改变x,y,z 只有当z有一定的值时,B才能看到x,y(不是z)并改变x(不是y,z) 问题是如何用Spring数据Rest实现这一点。ResourceProcessor似乎只适用于链接,验证器无法查看用户是否更改了字段 我已经实现了一个基于属性的访问控制,所以我可以创建和保存角色、权限和策略(使用SpEl),这些角色、权限和策略决定了谁可以轻松地查看和更改数据库中的特定字段 更新1 我添加了一个Jackson BeanSer

这个有代表性的例子:

有一个管理员用户A和一个普通用户B

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

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

问题是如何用Spring数据Rest实现这一点。ResourceProcessor似乎只适用于链接,验证器无法查看用户是否更改了字段

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

更新1

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

更新2

我已经添加了一个定制的Jackson Std(反)序列化程序,但现在我不能对每个实体动态使用它,因为我必须为每个实体编写完整的(反)序列化程序

更新3

经过两周的多次失败尝试,我将尝试将滤波器集成到SDR中

更新4


虽然我为PUT和PATCH请求添加了一个过滤器,但我意识到这将是更好的解决方案。现在我要为它们找到解决方案。

也许您可以使用@JsonView来描述您可以从DTO中读取什么和写入什么?


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

为什么不为这样的逻辑创建自定义控制器和服务呢?因为我必须对每个实体(10个实体和不断增长的实体)执行此操作,这意味着许多不必要的冗余代码。这不是通用的。我不寻找硬编码的解决方案。然后我会手动编写控制器。我认为,更简洁的方法是在每个字段上添加带有spring spel表达式的注释,并创建一个定制的jackson序列化器/反序列化器来分别处理每个字段。例如:@Deserialize(“hasRole('ADMIN'))私有字符串x;但是需要做大量的工作。但是对每个字段执行此操作也是非常冗余的。(反)序列化程序实际上是我最喜欢查找孤子的程序,但我只想扩展默认的SDR反(序列化程序)失败了…嘿,我很可能找到了符合你要求的东西:阅读rcomblen的答案。我的角色和权限是动态的(例如,“管理员”可以创建一个新角色“bla”,保存在数据库中),因此硬编码接口无法解决我的问题。无论如何,谢谢!
public class U{
    private Long id;
    private String x;
    private String y;
    private String z;
    [... getter and setter]
}