gpt4 book ai didi

rest - RESTful 服务中的资源级别授权

转载 作者:行者123 更新时间:2023-12-04 01:11:58 27 4
gpt4 key购买 nike

/users/{id}成为 RESTful 服务中的资源 url。

启用基本身份验证,只有经过身份验证的用户才能访问该 url。

示例场景:
User_1 & User_2是经过身份验证的用户,用户 ID 为 1 和 2。
由于两者都经过身份验证,因此它们都可以访问,

  • /users/1
  • /users/2

  • 但期望是 User_1应该可以访问 /users/1而不是 /users/2或其他用户 ID。

    题:
    如何在 RESTful 服务中进行资源级授权?

    注意:我正在使用 Jax-RS(使用 Apache CXF 实现)实现 RESTful,如果您能用 Jax-RS 进行解释会很有帮助。

    -巴拉特

    编辑:

    正如 Donal 所提到的,我不是在寻找基于角色的授权,而是在寻找资源级别的授权。

    举个例子,假设/users/{id}/photos/{photoId} 是另一个资源 url。 User_1 应该只能访问属于他的照片。如果photoId 为2 属于user_2,那么当请求/users/1/photos/2 请求时,我们应该为user_1 提供http_404 错误代码。[由于User_1 也是经过身份验证的用户,他可以调用/users/ 2 /photos/2,因此我们必须根据身份验证参数而不是通过资源 url 来识别用户 ID]

    我能想到的唯一解决方案是,包含确定每个查询中授权的唯一 ID,例如,

    而不是 SELECT * FROM PHOTO_TBL WHERE PHOTO_ID=2;
    使用 SELECT * FROM PHOTO_TBL, USER_TBL WHERE PHOTO_ID=2 AND USER_ID=1 AND USER_ID=PHOTO_ID;
    使用此资源提供属于特定用户的数据。 [应该有一种机制来防止在客户端修改用于决定授权的唯一 id(在这种情况下是 userId),因为所有请求都是 STATELESS 请求]

    警告:每个查询都应该足够智能以了解安全问题并包括额外的连接。这是将安全逻辑与每个业务功能联系起来的糟糕设计。

    我还没有研究 Spring 安全性以及如何在这个用例中使用它。

    最佳答案

    我建议不要在 url 中包含用户 ID(好像它被 Basic Auth header “限制”了,那么您也可以让它由 Basic auth header “指定”)。这将降低引入直接对象引用漏洞的风险 - https://www.owasp.org/index.php/Top_10_2010-A4-Insecure_Direct_Object_References )

    在这种情况下,您可以使用以下网址之一:

    /users/CURRENT
    /me

    由于照片是一个子资源,因此您可以在用户中创建带有“序列号”的照片。在 sql 数据库中,这意味着在 user 和 photo 列中都有一个“复合键”。
    /users/CURRENT/photo/{user_photo_seq}
    /me/photo/{user_photo_seq}

    您的 SQL 将如下所示:
    SELECT * FROM PHOTO_TBL WHERE USER_ID=<BasicAuthUsername> AND PHOTO_ID=<path param value>;

    “基本身份验证 header ”的一个很好的解释:

    http://en.wikipedia.org/wiki/Basic_access_authentication

    关于rest - RESTful 服务中的资源级别授权,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6634764/

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