【问题标题】:Spring - How to protect RESTful private resources?Spring - 如何保护 RESTful 私有资源?
【发布时间】:2013-01-21 20:07:11
【问题描述】:

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

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

【问题讨论】:

    标签: spring rest spring-mvc spring-security


    【解决方案1】:

    你可以在你的方法上做这样的事情:

        @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 功能。
    • 别担心,很高兴对你有用:)
    • 为了彻底,需要在spring安全上下文文件中启用安全注解添加&lt;security:global-method-security secured-annotations="enabled" /&gt;。
    • 您确定可以在@Secured 注释中指定类似"userid" 的值吗?我无法让它工作,在所有示例中,我发现它用于指定角色,例如@Secured({ROLE_ADMIN})。
    【解决方案2】:

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

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

    请参阅this post 了解如何操作。

    【讨论】:

      【解决方案3】:

      我强烈建议使用 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 来注入特定的使用名...

      【讨论】:

      • 感谢您的回答,但@Razh 的回答更具体。此外,从 RESTful 的角度来看,使用/resource/{user} 代表用户的资源更正确,而不是从安全上下文中扣除用户身份,从某些角色(例如管理员)甚至可以访问这些资源的角度来看也是如此。
      【解决方案4】:

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

      请注意,必须将&lt;security:global-method-security pre-post-annotations="enabled"/&gt; 添加到 servlet 上下文配置文件中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-08-18
        • 2014-04-06
        • 1970-01-01
        • 2015-08-10
        • 2020-11-30
        • 2013-10-02
        • 2012-12-26
        • 2015-03-19
        相关资源
        最近更新 更多