同一实体的两个存储库,一个已导出,一个未导出

Posted

技术标签:

【中文标题】同一实体的两个存储库,一个已导出,一个未导出【英文标题】:Two repos for the same entity, one exported and one not 【发布时间】:2016-06-01 21:57:34 【问题描述】:

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

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

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

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

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

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

然后将这个 repo 注入到上述控制器中。

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

【问题讨论】:

最后......我整个早上都在拔头发。我已经创建了 2 个存储库并且出现了奇怪的行为并且无法弄清楚。我终于搜索了 2 个 repos 并得到了你的问题。我已经设置了 PreAuthroize 一个方法级别,但直到我看到你也有它之前,我无法弄清楚我得到的奇怪行为 见jira.spring.io/browse/DATAREST-923 【参考方案1】:

您可以在类和方法级别添加@PreAuthorize,因此如果您只需要某些方法,请确保安全:

    只使用一个 repo 而不是两个 扩展Repository 而不是JPARepository

    PagingAndSortingRepository复制并粘贴(字面意思是,它们只是占位符)您需要的所有方法。

    根据您的需要将@PreAuthorize 添加到特定方法,而不是类。

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

【讨论】:

感谢 Luca,但这并不是我真正的目标。这种复制会增加混乱恕我直言。 恕我直言,我不明白拥有 2 个存储库比只有 1 个具有正确安全配置的存储库更容易混淆(每个开发人员都应该记住在不同情况下使用正确的存储库)。我还将编辑我的答案以使其更清晰。 @florind 和 Luca Abbati 爱你们俩 不可能,我本可以猜到这是我在 junit 跑步时遇到的问题!

以上是关于同一实体的两个存储库,一个已导出,一个未导出的主要内容,如果未能解决你的问题,请参考以下文章

如何导出具有依赖项的 SVN 存储库的一部分?

将导出的符号保存在共享库中

C#winform 两个datagridview中的数据一键导出到同一个excel中两个sheet页里

Altium designer 如何从已有的原理图和PCB图中导出一个新的集成库,请详细一点,谢谢!

Git本地存储库提交导出

OSGi:导出一个包而不导出同一个包中的几个类