3

我希望为我的 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 需要一个特定的角色。

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

4

2 回答 2

7

您可以为所有存储库添加自己的父类(请参阅文档中的操作方法)。然后只需添加所有必要的注释,您的安全限制将应用于所有子 bean。

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

于 2014-02-05T12:18:04.430 回答
5

如果您使用的是 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);

}
于 2014-02-07T22:29:00.900 回答