我有一些RESTful服务,用Spring MVC实现,暴露了一组资源。我已经使用基于HTTPBasicAuthentication和HTTPS的身份验证。某些资源只能由某些用户访问。
例如,我希望URI /users/{userid}/photos
中的所有子资源只能由用户userid
访问。实际上,在我的应用程序中,所有经过身份验证的用户都可以访如何保护他们免受userid
以外的其他用户的侵害?
如果我想仅允许对一部分用户(例如,userid
的朋友)访问此资源,该怎么办?
答案 0 :(得分:4)
你可以在你的方法上做这样的事情:
@ResponseBody
@RequestMapping(value = "/users/{userid}/photos", method = RequestMethod.GET)
@Secured(value = {"userid"})
public ResponseEntity<ModelMap> getPhotos(....) throws Exception {
如果您希望将来添加更多用户,只需执行
即可 @Secured(value = {"ROLE_ADMIN", "userid"})
答案 1 :(得分:1)
我强烈建议使用Spring Security。使用Spring安全性,您可以将对特定URL端点的访问权限限制为拥有特定角色的主体。
请参阅spring security intercept url roles
您还可以使用JSR-250注释:请参阅http://forum.springsource.org/showthread.php?126395-How-to-secure-Spring-MVC-controllers-using-Spring-Security-annotations
-
我认为您不需要将URL / resource / {user}限制为该特定用户。您应该从安全上下文中扣除用户名,不要让某人通过伪造URL来注入特定的用户名...
答案 2 :(得分:1)
您可以使用自定义安全表达式。
<security:intercept-url pattern="/users/{userid}/photos" access="getUserIdUrlPathParameter() == principal.userId"/>
请参阅this post了解如何操作。
答案 3 :(得分:0)
我使用@PreAuthorize("authentication.name == #userId")
代替@Secured(value = {"userid"})
或@Secured(value = {"#userid"})
之类的建议解决了这个问题,但是没有效果。
请注意,必须将<security:global-method-security pre-post-annotations="enabled"/>
添加到servlet上下文配置文件中。