假设/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}是另一个资源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, USER_TBL WHERE PHOTO_ID=2 AND USER_ID=1 AND USER_ID=PHOTO_ID;
而不是SELECT * FROM PHOTO_TBL WHERE PHOTO_ID=2;
使用这些资源传递属于特定用户的数据。[需要一种机制来防止客户端修改用于授权的唯一标识符(在此情况下为userId),因为所有请求都是无状态请求]
注意:每个查询都应该足够智能,以理解安全问题并包含额外的连接。将安全逻辑绑定到每个业务函数是一个糟糕的设计。
我还没有研究Spring安全性以及如何在这种用例中使用它。