gpt4 book ai didi

java - Spring Boot 和 JPA 存储库 — 如何按 ID 过滤 GET

转载 作者:行者123 更新时间:2023-12-01 06:25:43 25 4
gpt4 key购买 nike

我正在重写一个应用程序,这次使用 Spring 的 RESTful 接口(interface)。我认为服务器端授权是最好的。即:

  • 假设用户 1 使用此 REST 存储库。他/她访问 mysite.com/heroes/1 并从英雄表中获取 (id = 1) 英雄。

  • 用户 2 无权查看 (id = 1) 英雄,但可以制作一个 cURL 语句来尝试。我声称服务器应该阻止用户 2 访问 (id = 1) 英雄。

我相信服务器可以提取 JWT 有效负载,为我提供用户名或密码(我将其放在那里)。服务器从该有效负载中获取用户的帐户并知道他/她有权看到哪些英雄。

我已经通过服务和 DAO 类实现了这个目标。然而,我看到 Spring Boot 和 JPA 教程提倡使用 CrudRepository 实现来减少编码。我想知道如何使用这项技术进行过滤。

以下是来自网络的示例:

@RepositoryRestResource(collectionResourceRel = "heroes", path = "heroes")
public interface HeroRepository extends CrudRepository<Hero, Long> {
}

当访问 mysite.com/heroes/1 时,它会自动返回英雄 (id = 1) 的数据。我想指示它让我选择允许哪些 ID 值。也就是说,在运行时通过代码向其提供查询参数。

作为测试,我提供了以下代码:

@RepositoryRestResource(collectionResourceRel = "heroes", path = "heroes")
public interface HeroRepository extends CrudRepository<Hero, Long> {

@Query ("from Hero h where id in (1, 3, 5)")
public Hero get();

}

但是,它不会阻止 mysite.com/heroes/2 返回 (id = 2) 英雄。

如何实现我想要的目标?

谢谢杰罗姆。

更新 5 月 13 日下午 5:50

我的请求被误解了,所以我进一步解释了我的意图。

  • 用户 1 和 2 是普通用户,正在访问他们的帐户。
  • 每个用户都必须仅限于他/她自己的帐户。
  • 用户无法通过伪造他人数据请求来进行欺骗。

因此,服务器需要从 JWT token 中提取用户 ID 等,并将其在代码中应用到导致/heroes 查询工作的任何内容。

我的原始示例源自 this tutorial 。其中唯一的 Java 类是 Hero 和 HeroRepository。 DAO、服务或 Controller 没有显式的类。包含的 Spring 库允许所有/heroes 获取发生,无需进一步编码。

再次感谢您的关注和帮助。杰罗姆.

最佳答案

您可以创建一个自定义@Query,它使用登录用户的信息(此处:id)。通过此解决方案,用户只能访问与他具有相同 id 的实体。

@Override
@Query("SELECT h FROM Hero h WHERE h.id=?1 AND h.id=?#{principal.id}")
public Hero findOne(Long id);

您需要为 @Query ( link ) 启用 SpEl 并使用自定义 UserDetails 创建自定义 UserDetailsS​​ervice ( link ),其中包含用户,因此您可以执行principal.id

以同样的方式,您应该保护 findAll() 方法。

关于java - Spring Boot 和 JPA 存储库 — 如何按 ID 过滤 GET,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43955406/

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