【发布时间】:2022-01-06 12:25:54
【问题描述】:
假设我有一个 JpaRepository 管理一个实体并提供自动生成的 CRUD 端点来创建和读取所述实体:
@CrossOrigin
@RepositoryRestResource(path = "testentity", itemResourceRel = "testentity", collectionResourceRel = "testentity")
public interface TestEntityRepository extends JpaRepository<TestEntity, Long> {
}
由于这提供了可分页和可排序的结果,我真的很想使用提供的端点,但我想根据用户角色限制对这些端点的访问。用户存储在客户端发送的各个请求的“会话”字段中:
request.getSession().getAttribute("user")
每个用户都有一组指定其权限的角色。 (只是一个字符串列表)。 是否有一种简单的方法来保留 JpaRepository 提供的自动生成的端点并根据 user.roles 字段的内容限制对它们的访问?
请注意,用户是在之前通过第三方应用程序进行身份验证后生成的。这意味着每个用户的角色不会保留在可读数据源中,而是必须在每次用户登录时从所述应用程序请求。
登录过程如下所示:
- 用户发送用户名和密码
- 应用程序将用户名和密码发送给第三方应用程序
- 第三方应用程序发回如果用户存在及其角色
- 应用程序使用接收到的角色创建用户对象
- 用户在会话中使用并在会话到期时被丢弃(这意味着每个用户只在每个会话期间存在)
用户类别:
@Entity
@Table(name = "user")
@Data
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ElementCollection
private List<String> roles;
private String token;
private DateTime expiration;
}
澄清:如果有 2 个角色(“用户”,“管理员”),我希望只有具有“管理员”角色的用户可以访问 POST 端点,因为任何用户都应该可以访问 GET 方法(“管理员”和“用户”)。
【问题讨论】:
标签: spring spring-boot spring-security spring-data-jpa