Spring Data Rest 中的字段安全性
Posted
技术标签:
【中文标题】Spring Data Rest 中的字段安全性【英文标题】:Field Security in Spring Data Rest 【发布时间】: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 个实体并不断增长)都这样做,这意味着许多不必要的冗余代码。 【参考方案1】:也许您可以使用 @JsonView 来描述您可以从 DTO 读取什么以及可以写入什么? http://www.baeldung.com/jackson-json-view-annotation
因此,您将拥有一个管理员视图和一个简单用户视图。
【讨论】:
那不是通用的。我不寻找硬编码的解决方案。然后我会手动编写控制器。 我认为更简洁的方法是在每个字段上添加带有 spring-spel 表达式的注释,并创建一个自定义杰克逊序列化器/反序列化器来单独处理每个字段。例如:@Deserialize("hasRole('ADMIN'") private String x; 但需要做很多工作。 但是对每个字段都这样做也是很多余的。 (De)Serializer 实际上是我最喜欢找到的解决方案,但我只是想扩展默认的 SDR de(serializer) 并失败了... 嘿,我可能找到了符合您要求的东西:***.com/questions/17276081/… 阅读 rcomblen 的答案。 我的角色和权限是动态的(例如“管理员”可以创建一个新角色“bla”,该角色保存在数据库中),因此硬编码接口无法解决我的问题。还是谢谢!以上是关于Spring Data Rest 中的字段安全性的主要内容,如果未能解决你的问题,请参考以下文章
默认情况下,不要使用Spring Data Rest和Jpa公开Entity类中的字段