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<T> 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,如何查询 OneToMany 单向字段?