Let /users/{id}
是 RESTful 服务中的资源 url。
启用基本身份验证,仅允许经过身份验证的用户访问该 url。
示例场景:
User_1
& User_2
是通过 userId 1 和 2 进行身份验证的用户。
由于两者都经过身份验证,因此它们都可以访问,
但期望是User_1
应该有权访问/users/1
并且不/users/2
或其他用户 ID。
问题:
如何在RESTful服务中进行资源级授权?
注意:我正在使用 Jax-RS 实现 RESTful(使用 Apache CXF 实现),如果您能用 Jax-RS 进行解释,将会很有帮助。
-Barath
Edit:
正如 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;
use SELECT * FROM PHOTO_TBL, USER_TBL WHERE PHOTO_ID=2 AND USER_ID=1 AND USER_ID=PHOTO_ID;
使用此资源正在传递属于特定用户的数据。 [应该有一种机制来防止客户端修改用于决定授权的唯一 ID(在本例中为 userId),因为所有请求都是无状态请求]
Caveat:每个查询都应该足够智能,能够理解安全问题并包含额外的联接。将安全逻辑与每个业务功能联系起来是一个糟糕的设计。
我还没有研究 Spring security 以及如何在这个用例中使用它。