JpaRepository 上的@PreAuthorize

Posted

技术标签:

【中文标题】JpaRepository 上的@PreAuthorize【英文标题】:@PreAuthorize on JpaRepository 【发布时间】:2014-03-01 09:15:49 【问题描述】:

我希望为我的 REST 服务实施基于角色的安全性。我正在使用 spring-data-rest 并已配置 JpaRepository 如下:

@Repository
@RestResource(path = "changesets", rel = "changesets")
public interface ChangesetRepository extends JpaRepository<Changeset, Long>  

我想将@PreAuthorize 注释附加到继承的Page&lt;T&gt; findAll(Pageable pageable) 方法,以便GET 需要特定角色。

有没有办法做到这一点?我需要提供自定义实现还是我遗漏了一些明显的东西?

【问题讨论】:

【参考方案1】:

如果您使用 Spring Data REST 您的想法是合理的。在您的接口类中,只需重新定义相同的方法并为其添加 @PreAuthorize 注释。代码应该是这样的,虽然我没有测试过

@Repository
@RestResource(path = "changesets", rel = "changesets")
public interface ChangesetRepository extends JpaRepository<Changeset, Long>  

@PreAuthorize("#pk == authentication.id") 
Page<Changeset> findAll(Pageable pageable);


【讨论】:

【参考方案2】:

您可以为所有存储库添加自己的父类(请参阅how to do it in the documentation)。然后只需添加所有必要的注释,您的安全限制就会应用于所有子 bean。

从架构的角度来看,大多数时候存储库不是应用安全限制的正确位置。您的服务层是更合适的位置(因为您的安全限制取决于您的业务操作,而不是您的数据加载逻辑)。考虑以下示例:您希望在许多服务中重用相同的存储库,并且安全规则不同(对于这些服务)。怎么办?

【讨论】:

以上是关于JpaRepository 上的@PreAuthorize的主要内容,如果未能解决你的问题,请参考以下文章

查询验证失败:JpaRepository

如何将对象从一个 JpaRepository 转换为另一个 JpaRepository

JpaRepository 查询参数未动态更新

JpaRepository,如何查询 OneToMany 单向字段?

JPARepository,名称方法返回包含“文本”的字段[关闭]

jparepository 无法解析为类型