【问题标题】:Spring security without jsp没有jsp的Spring安全
【发布时间】:2016-08-16 07:31:51
【问题描述】:

我将在我的 Javascript 前端 + Spring MVC 项目(用户管理管理 Web 应用程序)中使用 Spring 安全性作为我的后端代码,所以我可以利用某些 jsp 标签。或者我可以完美地使它成为一个 ajax 应用程序,在不同的服务器中服务前端。并且仍然完全使用弹簧安全?

【问题讨论】:

    标签: java spring spring-mvc spring-security


    【解决方案1】:

    这里我假设:

    • javascript 前端
    • 主要服务于 JSON 的 Spring MVC REST 应用程序

    从安全的角度来看,spring security 只能保护后端应用程序,你应该记住前端安全(在浏览器视图中隐藏链接或命令)只是一种假象,因为用户总是可以伪造一个请求,甚至是一个 Ajax 请求。

    从用户体验的角度来看,很明显,您永远不应该向用户展示一种可能性,并且当他使用它时,告诉他不允许这样做。因此,您的前端必须知道授予用户哪些权限。 Spring security 带有一些在 JSP 页面中可用于服务器端的标签,但是对于 Javascript 前端,您可以(应该?)实现一个特殊的 URL 服务器端,它返回当前用户的能力,一旦用户在此处发送请求经过身份验证,并将结果缓存在客户端会话中(Windows.sessionStorage)。这样,您的 javascript 代码就知道应该向特定用户显示什么。

    【讨论】:

    • 有没有办法获取当前用户的可用网址?
    【解决方案2】:

    您可以使用 spring security 来保护在控制器中提供 AJAX JSON 调用级别的请求 URL,这就是我的建议。

    无论您如何在 JS 前端显示/隐藏特性、数据等,重要的是保护提供特性和数据的 JSON 调用。这样,即使最终用户试图破解您的前端(他们可能会,因为这很容易),也可以确保他们不会因为缺乏访问权限而无法执行 REST 调用。

    你的问题是“你能”让这个安全而不是使用 JSP 标签吗?绝对 - 确保如上所述正确处理呼叫级别的所有安全性,并且您将被设置。您应该构建您的 REST/JSON 服务,就像一个单独的应用程序一样,可以在任何类型的前端中使用。

    【讨论】:

      【解决方案3】:

      您可以使用 Spring Security 来保护您的服务器端,这意味着对您的问题的简短回答是:“我可以完美地使它成为一个 ajax 应用程序[..]?”是的。

      对于 Ajax 应用程序,我的建议是让您的服务器端成为 RESTful API,所以我会假设是这种情况。

      有两个元素有助于“安全”:身份验证和授权。

      身份验证意味着客户端提供一些凭据(例如密钥、OAuth 令牌、用户/密码组合),让您确信他或她确实是他们声称的身份(即用户 ID 12345)。此身份验证将作为会话的一部分由您的应用程序保留。由于 Http 是无状态的,因此对服务器的每个后续请求都需要发送该会话的标识,以便服务器可以查找它。你可以找到here 所有你需要知道的关于 Spring Security 的认证。在不知道您的用户计划如何进行身份验证的情况下,我无法更具体。

      授权更直接:用户 id 12345 可能无法访问所有内容。例如,他可能有权访问/widgets/gidgets,但不能访问/widgets/fidgets。要实现这一点,最简单的方法是通过 @PreAuthorize 注释。了解更多信息here。一个示例如下所示:

      @RestController
      @RequestMapping("/widgets")
      public class WidgetController{
          @RequestMapping("/gidgets")
          @PreAuthorize("hasRole('GIDGET_MANAGER')")
          List<Gidget> getGidgets(){
              return gidgetService.getGidgets();
          }
      
          @RequestMapping("/fidgets")
          @PreAuthorize("hasRole('FIDGET_MANAGER')")
          List<Fidget> getFidgets(){
              return fidgetService.getFidgets();
          }
      }
      

      在幕后,它的作用是拦截请求,根据路径,验证当前经过身份验证的用户是否具有您指定的名称的角色,并允许该方法在肯定的情况下执行。否则,它会完全跳过方法执行并向客户端返回 401 UNAUTHORIZED 响应。

      【讨论】:

        猜你喜欢
        • 2019-03-18
        • 2014-06-14
        • 2018-02-15
        • 2012-12-04
        • 2015-07-10
        • 2014-05-26
        • 2015-04-15
        • 2011-04-12
        • 2012-08-12
        相关资源
        最近更新 更多