Spring boot Spring数据Rest中的字段安全性
这个有代表性的例子: 有一个管理员用户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中 更新4Spring 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
虽然我为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]
}