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

3

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

例如,我想要在URI /users/{userid}/photos 中的所有子资源仅可由用户userid访问。实际上,在我的应用程序中,它们可以被所有经过身份验证的用户访问。如何保护它们不被除userid以外的其他用户访问? 如果我想要将此资源仅允许特定的一些用户(例如userid的朋友)访问,该怎么做?

4个回答

5

您可以在您的方法中像这样做:

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

您可以在未来通过执行以下操作添加更多用户:
    @Secured(value = {"ROLE_ADMIN", "userid"})

谢谢,我一直在想念这些Spring Security功能。 - user1781028
没关系,很高兴能对您有所帮助 :) - justMe
1
为了更加彻底,需要在Spring安全上下文文件中添加<security:global-method-security secured-annotations="enabled" />以启用安全注释。 - user1781028
你确定可以在@Secured注解中指定像"userid"这样的值吗?我无法让它工作,并且在我找到的所有示例中,它都用于指定角色,例如@Secured({ROLE_ADMIN}) - user1781028

1

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

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

请参考此篇文章了解如何操作。


0

我通过使用@PreAuthorize("authentication.name == #userId")解决了问题,而不是像建议的那样使用@Secured(value = {"userid"})@Secured(value = {"#userid"}),因为它们无法正常工作。

请注意,在servlet上下文配置文件中添加<security:global-method-security pre-post-annotations="enabled"/>是必要的。


0
我强烈建议使用Spring Security。使用Spring Security,您可以将对特定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注入特定的用户名...


谢谢您的回答,但是@Razh的回答更具体。此外,从RESTful的角度来看,使用/resource/{user}来表示用户资源更加正确,而不是从安全上下文中推断用户身份,也考虑到某些角色(例如管理员)可以访问这些资源。 - user1781028

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接