我希望为我的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需要特定的角色。
有办法吗?我是否需要提供自定义实现,或者我错过了一些明显的内容?
答案 0 :(得分:7)
您可以为所有存储库添加自己的父类(请参阅how to do it in the documentation)。然后只需添加所有必要的注释,您的安全限制将适用于所有子bean。
从架构的角度来看,大多数情况下,存储库不是应用安全限制的正确位置。您的服务层更合适(因为您的安全限制取决于您的业务操作,而不取决于您的数据加载逻辑)。请考虑以下示例:您希望在许多服务中重用相同的存储库,并且安全规则不同(对于这些服务)。怎么办?
答案 1 :(得分:4)
如果您使用的是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);
}