同一实体的两个回购,一个导出,一个不导出

时间:2016-02-20 07:21:48

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

使用Sring Data JPA,Spring Data REST 2.4.2,Spring Security和Spring Boot 1.3.1。我有一个我想通过REST公开的帐户实体用于管理目的:

@PreAuthorize("hasRole('ROLE_ADMIN')")  //exclusive admin access
public interface AccountRepository extends JpaRepository<Account, Long> {}

这可以按预期工作,我可以使用适当的管理员角色访问REST界面。

我的另一个要求是允许非管理员用户通过HTTP注册和验证。为此,我创建了一个自定义Controller,它通过/ register和/ login资源公开register()和login()功能。问题是,当注册/登录内部逻辑与上面的repo交互时,除了匿名之外,没有可附加的用户安全上下文。

为了简单起见,我创建了第二个未导出且没有安全要求的仓库:

@RepositoryRestResource(exported = false)
public interface AccountRepositoryInternal extends JpaRepository<Account, Long> {}

然后将该回购物注入所述控制器。

问题是我看到导出的界面行为不一致。在某些运行时环境中,接口通过REST导出,而在其他环境中则不是。我可以使用更好的策略吗?

1 个答案:

答案 0 :(得分:3)

您可以在类和方法级别添加@PreAuthorize,因此如果您只需要一些方法,那么只需要保护:

  1. 只使用一个repo而不是两个
  2. 将[{1}}
  3. 扩展为Repository
  4. JPARepository复制并粘贴(字面意思是它们只是占位符)所有方法。

  5. 根据您对特定方法的需求添加PagingAndSortingRepository,而不是类。

  6. 在存储库接口之间复制和粘贴方法是文档建议(http://docs.spring.io/spring-data/jpa/docs/1.9.2.RELEASE/reference/html/#repositories.definition-tuning),如果你想要一个细粒度的控件,例如在你的情况下。