spring-security – 同一实体的两个repos,一个导出,一个不导出

使用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导出,而在其他环境中则不是.我可以使用更好的策略吗?

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

>只使用一个仓库而不是两个仓库
>扩展存储库而不是JPARepository
>从PagingAndSortingRepository复制并粘贴(字面意思,它们只是占位符)所有方法.
>根据您对特定方法的需求添加@PreAuthorize,而不是类.

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

点赞