Spring - 如何保护RESTful私有资源?

时间:2013-01-10 14:27:09

标签: spring rest spring-mvc spring-security

我有一些RESTful服务,用Spring MVC实现,暴露了一组资源。我已经使用基于HTTPBasicAuthentication和HTTPS的身份验证。某些资源只能由某些用户访问。

例如,我希望URI /users/{userid}/photos中的所有子资源只能由用户userid访问。实际上,在我的应用程序中,所有经过身份验证的用户都可以访如何保护他们免受userid以外的其他用户的侵害? 如果我想仅允许对一部分用户(例如,userid的朋友)访问此资源,该怎么办?

4 个答案:

答案 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上下文配置文件中。