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