3

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

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

4

4 回答 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"})
于 2013-01-10T14:37:59.693 回答
1

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

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

请参阅这篇文章了解如何操作。

于 2013-01-10T14:41:36.470 回答
0

我通过使用@PreAuthorize("authentication.name == #userId"), 而不是@Secured(value = {"userid"})@Secured(value = {"#userid"})像建议的那样解决了它,但它不起作用。

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

于 2013-01-21T12:07:11.353 回答
0

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

查看spring security 拦截 url 角色

您还可以使用 JSR-250 注释:参见http://forum.springsource.org/showthread.php?126395-How-to-secure-Spring-MVC-controllers-using-Spring-Security-annotations

--

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

于 2013-01-10T14:30:56.203 回答