【问题标题】:@PreAuthorize on JpaRepositoryJpaRepository 上的@PreAuthorize
【发布时间】: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 需要特定角色。

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

【问题讨论】:

    标签: spring spring-security spring-data-jpa spring-data-rest


    【解决方案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。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-04-07
        • 2015-08-12
        • 1970-01-01
        • 2015-01-30
        • 2017-11-16
        • 2015-10-12
        • 1970-01-01
        • 2011-12-13
        相关资源
        最近更新 更多