Bar*_*ath 12 rest authorization restful-authentication jax-rs
让我们/users/{id}成为RESTful服务中的资源URL.
启用基本身份验证,只允许经过身份验证的用户访问该URL.
示例场景:
User_1&User_2是使用userId 1和2的经过身份验证的用户.由于两者都经过身份验证,因此他们都可以访问,
/users/1/users/2但期望是User_1应该访问/users/1而不是/users/2或其他userId.
问题:如何在RESTful服务中进行资源级别授权?
注意:我正在使用Jax-RS(使用Apache CXF实现)实现RESTful,如果您可以使用Jax-RS进行解释,这将非常有用.
-Barath
编辑:
正如Donal所说,我不是在寻找基于角色的授权而是资源级授权.
举个例子,让/ users/{id}/photos/{photoId}成为另一个资源网址.User_1应该只能访问属于他的照片.如果photoId属于user_2,那么当请求request/users/1/photos/2时,我们应该为user_1提供http_404错误代码.[由于User_1也是经过身份验证的用户,他可以调用/ users/2/photos/2,所以我们必须根据认证参数识别用户ID,而不是通过资源url]
我能想到的唯一解决方案是,包括确定每个查询中授权的唯一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 标头的“限制”,那么您也可以通过 Basic Auth 标头“指定”它)。这将降低引入直接对象引用漏洞的风险 - https://www.owasp.org/index.php/Top_10_2010-A4-Insecure_Direct_Object_References)
在这种情况下,您可以拥有以下网址之一:
/users/CURRENT
/me
Run Code Online (Sandbox Code Playgroud)
由于照片是子资源,因此您可以在用户内创建带有“序列号”的照片。在 SQL 数据库中,这意味着在用户列和照片列上都有一个“复合键”。
/users/CURRENT/photo/{user_photo_seq}
/me/photo/{user_photo_seq}
Run Code Online (Sandbox Code Playgroud)
那么你的 SQL 将类似于:
SELECT * FROM PHOTO_TBL WHERE USER_ID=<BasicAuthUsername> AND PHOTO_ID=<path param value>;
Run Code Online (Sandbox Code Playgroud)
对“基本身份验证标头”的一个很好的解释:
http://en.wikipedia.org/wiki/Basic_access_authentication
| 归档时间: |
|
| 查看次数: |
3590 次 |
| 最近记录: |