同一实体的两个存储库,一个已导出,一个未导出
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 跑步时遇到的问题!以上是关于同一实体的两个存储库,一个已导出,一个未导出的主要内容,如果未能解决你的问题,请参考以下文章
C#winform 两个datagridview中的数据一键导出到同一个excel中两个sheet页里