【问题标题】:Check for User Role in Autogenerated Endpoints of JpaRepository检查 JpaRepository 的自动生成端点中的用户角色
【发布时间】: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


    【解决方案1】:

    Spring-Security 提供高级选项,用于通过基于安全上下文信息的注释来限制方法访问,例如:

    @PreAuthorize("hasRole('admin'))
    

    这些可用于存储库接口(适用于所有方法),或基于每个方法。

    官方示例:https://github.com/spring-projects/spring-data-examples/tree/main/rest/security

    (根据您的安全配置,您可能需要以自定义方式设置SecurityContextAuthentication。)

    【讨论】:

    • 您好,感谢您的回复!我想我只是不太了解通常如何处理身份验证。是否“@PreAuthorize("hasRole('admin'))”- 注释检查会话的“用户”属性中名为“角色”的字段以及它是否包含字符串“管理员”或者我是否必须设置首先配置配置,所以它知道在哪里看?我能找到的所有示例(包括您的链接)都显示了内存设置,据我所知,这对我来说并不是真正可用的,因为我需要经常添加和删除用户和改变角色等等。
    • 如何创建“用户对象”?您需要实现您的自定义AuthenticationProvider,其authenticate 方法返回一个UsernamePasswordAuthenticationToken,其中包含您从第三方应用程序获得的用户数据和角色。那么这种方法应该可行。
    猜你喜欢
    • 1970-01-01
    • 2015-12-20
    • 2013-03-31
    • 2013-01-13
    • 2022-10-16
    • 1970-01-01
    • 2020-08-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多