gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 20:35:52 25 4
gpt4 key购买 nike

使用 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> {}

然后将该 repo 注入(inject)到所述 Controller 中。

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

最佳答案

您可以添加@PreAuthorize在类和方法级别,所以如果您只需要一些方法,请确保:

  • 只使用一个 repo 而不是两个
  • 扩展 Repository而是 JPARepository
  • PagingAndSortingRepository 复制并粘贴(实际上,它们只是占位符)您需要的所有方法.
  • 添加 @PreAuthorize根据您的需要具体方法,而不是类。

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

    关于spring-security - 同一实体的两个存储库,一个已导出,一个未导出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35520362/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com