【问题标题】:Restrict users to create data only for themselves限制用户仅为自己创建数据
【发布时间】:2021-01-07 10:51:33
【问题描述】:

我在 kubernetes 上部署了一个微服务架构,带有 istio 网关,AWS cognito 用于身份验证。现在,当用户登录到 APP 时,他可以使用 API 创建/查看数据。移动 FE 应用程序发送需要为其创建或获取数据的登录用户的“userId”。来自 cognito 的 JWT 令牌随声明中包含 userId 的每个请求一起发送。

我想要实现的是限制我的 API,以便只为发送令牌的用户创建数据,或者只为 JWT 令牌中的用户获取数据。例如考虑以下请求

POST /api/data/submit

{
    "name": "John doe",
    "address": "131 parklane street",
    "userId": 1000,
    ...
}

在上述请求中,任何用户(Say id:90)都可以为用户id 1000创建数据。

目前在项目中实现的解决方案是使用 Spring Aspects。缺点是它仅适用于将 userId 作为 PathVariable 发送的 API,尽管可以修改它以使用反射检查请求对象,但效率不高。

我想到的解决方案是使用 Bean Validation。我创建了一个自定义注释,可以使用自定义验证器在字段和参数级别应用,并验证该值是否应与令牌中存在的 userId 匹配。

我尝试寻找最佳方法,但大部分都找到了基于角色授权的解决方案,尽管我想要实现的目标有所不同。

任何指导都会有所帮助。

【问题讨论】:

    标签: spring spring-boot authorization bean-validation


    【解决方案1】:

    在我的一个项目中,我们也在做同样的事情。在此类调用中,我们不会发送 userId 字段。服务从令牌中提取相同的内容,而不是依赖于 POST 数据字段。

    【讨论】:

    • 谢谢。我也提出了这个建议。但是我的 TL 说它感觉不像是 REST API 方法 :) 虽然这是正确的方法。
    • REST 与否取决于 API 和资源。例如,您正在为用户管理个人资料。所以 /profile 带有 POST 调用而没有 userId 是有意义的。如果在您的情况下,这没有意义,那么自定义验证器是简单的方法(不是最好/好的):)
    猜你喜欢
    • 2013-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 2017-11-15
    • 2020-01-25
    • 1970-01-01
    相关资源
    最近更新 更多