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

标签 java spring rest spring-data spring-data-rest

在使用 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/

相关文章:

Java 按条件用空格分割

java - 用于集成测试的 Spring-boot 默认配置文件

用于注解驱动任务的 Spring @Configuration(非 xml 配置)

asp.net-mvc - 带有 urlEncoded 部分的 WebApi 路由

ruby-on-rails-3 - Rest on Rails 3 的助手 Gem

javascript - restify.serveStatic 不处理默认文档

java.security.AccessControlException : access denied (java. util.PropertyPermission http.agent 读取)

java - 我应该重写 Object.equals(Object) 方法吗?

java - Java 中的内存泄漏 (Swing)

java - 从 Spring Boot 运行时出现 AWSLambdaException 和 InvalidSignatureException