在使用 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 .
考虑其他选择(其他已经提到):
- 模型重构。按访问逻辑拆分实体(例如
Person
<->Account
) - 为特殊逻辑和访问检查添加自定义端点。例如,“/people/me”中的当前用户。
- 自定义标准端点。例如,为“/people”、“/people/{id}”添加自定义 Controller ,根据用户权限(例如返回
PublicPerson)预处理并返回自定义
而不是Resource
类型 (DTO)Person
)。然后,您可以编写自定义资源处理器,为这些类型添加自定义链接和自定义投影。
另请参阅:spring-data-rest 关于此主题的问题 DATAREST-428 .
关于java - 如何按角色限制对 Spring Data REST 投影的访问?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33661815/