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

Spring-如何保护RESTful私有资源?,spring,rest,spring-mvc,spring-security,Spring,Rest,Spring Mvc,Spring Security,我使用SpringMVC实现了一些RESTful服务,公开了一组资源。我已经使用了基于HTTPBasicAuthentication和HTTPS的身份验证。某些资源必须只能由某些用户访问 例如,我希望URI/users/{userid}/photos中的所有子资源都只能由用户userid访问。实际上,在我的应用程序中,所有经过身份验证的用户都可以访问它们。除了userid,我如何保护它们不受其他用户的攻击? 如果我只想允许一部分用户(比如,userid的朋友)访问这些资源,该怎么办?我强烈建议使

我使用SpringMVC实现了一些RESTful服务,公开了一组资源。我已经使用了基于HTTPBasicAuthentication和HTTPS的身份验证。某些资源必须只能由某些用户访问

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

我强烈建议使用Spring安全性。使用Spring安全性,您可以将对特定URL端点的访问限制为拥有特定角色的主体

您还可以使用JSR-250注释:请参阅

--


我认为您不需要将URL/resource/{user}限制为该特定用户。您应该从安全上下文中扣除用户名,不要让某人通过伪造URL来注入特定的用户名…

您可以在方法上执行类似操作:

    @ResponseBody
    @RequestMapping(value = "/users/{userid}/photos", method = RequestMethod.GET)
    @Secured(value = {"userid"})
    public ResponseEntity<ModelMap> getPhotos(....) throws Exception {

您可以使用自定义安全表达式

<security:intercept-url pattern="/users/{userid}/photos" access="getUserIdUrlPathParameter() == principal.userId"/>


请参阅以了解如何操作。

我通过使用
@PreAuthorize(“authentication.name==#userId”)
解决了这个问题,而不是像建议的那样使用
@Secured(value={“userId”)
@Secured(value={#userId})解决了这个问题,因为它们不起作用


注意,有必要将
添加到servlet上下文配置文件中。

谢谢您的回答,但是@rash的回答更为具体。此外,从RESTful的角度来看,使用
/resource/{user}
来表示用户的资源更为正确,而不是从安全上下文中扣除用户身份,这也是因为某些角色(es.admin)甚至可以访问这些资源。谢谢,我错过了这些Spring安全功能。不用担心,GLADY对您很有用:)为了彻底起见,有必要启用安全批注,在spring安全上下文文件中添加
。您确定可以在
@Secured
批注中指定类似
“userid”
的值吗?我无法让它工作,在所有示例中,我发现它都用于指定角色,比如
@Secured({role\u ADMIN})
<security:intercept-url pattern="/users/{userid}/photos" access="getUserIdUrlPathParameter() == principal.userId"/>