gpt4 book ai didi

java - 如何按角色限制对 Spring Data REST 投影的访问?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:24:58 26 4
gpt4 key购买 nike

在使用 Spring Data JPA 和 Spring Data REST 的应用程序中,假设您有一个这样的实体类:

@Entity
public class Person {

@Id @GeneratedValue
private int id;

private String name;

@JsonIgnore
private String superSecretValue;

...

}

我们希望 Spring Data REST 公开此实体的所有字段,superSecretValue 除外,因此我们用 @JsonIgnore 注释了该字段。

但是,在某些情况下,我们确实想要访问 superSecretValue,因此我们创建了一个投影,它将返回包括该字段在内的所有字段:

@Projection(name = "withSecret", types = {Person.class})
public interface PersonWithSecret {

String getName();
String getSuperSecretValue();

}

太棒了。所以现在我们可以像这样访问 Person 实体包括 superSecretValue 字段:

curl http://localhost:8080/persons?projection=withSecret

我的问题是我们如何确保投影?我们如何配置使得任何人都可以检索 Person 实体 而无需 superSecretValue 字段...但只有具有特定角色的人(例如, ROLE_ADMIN) 可以使用投影来检索隐藏字段吗?

我发现了无数使用 @PreAuthorize@Secured 注释来保护 Spring Data JPA 存储库 CRUD 方法的示例(例如 save(), delete())... 但没有示例说明如何限制 Spring Data REST 投影的使用。

最佳答案

您可以使用带有条件 SpEL 表达式的 @Value 重载投影中的属性 - 如此 already answered similar question .

考虑其他选择(其他已经提到):

  1. 模型重构。按访问逻辑拆分实体(例如Person <-> Account)
  2. 为特殊逻辑和访问检查添加自定义端点。例如,“/people/me”中的当前用户。
  3. 自定义标准端点。例如,为“/people”、“/people/{id}”添加自定义 Controller ,根据用户权限(例如返回 PublicPerson)预处理并返回自定义 Resource 类型 (DTO) 而不是 Person)。然后,您可以编写自定义资源处理器,为这些类型添加自定义链接和自定义投影。

另请参阅:spring-data-rest 关于此主题的问题 DATAREST-428 .

关于java - 如何按角色限制对 Spring Data REST 投影的访问?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33661815/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com