如何保护 Angular.js 或 Ember.js 的 Spring RESTful Web 服务

Posted

技术标签:

【中文标题】如何保护 Angular.js 或 Ember.js 的 Spring RESTful Web 服务【英文标题】:How to secure a Spring RESTful webservice for Angular.js or Ember.js 【发布时间】:2014-03-04 01:57:21 【问题描述】:

我有一个 Spring MVC 应用程序,它使用 Spring Security 来处理用户登录身份验证,效果很好。

现在我想向访问 Spring RESTful Web 服务(仅返回 JSON 数据)的 html 页面添加一些 Ember.js 和 Angular.js 代码。

如何将用户登录身份验证绑定到 RESTful Web 服务的身份验证?换句话说,我想让 RESTful Web 服务只有在用户登录后才能访问。这样,Angular.js 和 Ember.js 库只能从我的用户页面安全地访问这些 RESTful Web 服务其他任何人都无法直接呼叫他们。

我在另一篇文章中读到,Spring Security 从未打算与完整的 Ajax 框架一起使用,这是真的吗?我希望情况并非如此。我想这种类型的东西现在一定很普遍,因为有很多 AJAX 客户端框架基于访问 JSON/RESTful API 来工作。

【问题讨论】:

【参考方案1】:

Spring Security 从未打算用于或不能用于 AJAX 应用程序,这当然不是真的。我有两个使用 Spring Security 和 AJAX 的生产应用程序,还有更多正在开发的应用程序使用相同的组合。

如果您打算在 Spring Security 工作的现有 Web 应用程序中使用 EmberJS 或 AngularJS,如果您只是将 javascript 库添加到您的项目中,您应该不会遇到太多问题。这是因为一旦您的用户通过身份验证,任何正常的 HTTP 请求也将被视为经过身份验证,因为浏览器将确保会话信息在适当的情况下使用 cookie 或 URL 参数来回传递。您可以查看我的 working examples on Github 之一,用于 Spring Security 和 EmberJS 集成。

您可能需要担心的唯一一件事是使用 AJAX 提交表单的 CSRF 令牌。最新的 Spring Security 文档有一小部分专门讨论这个问题,所以你也不应该遇到太多问题来让它工作。但是,我想澄清一下,这个特定问题并不是 Spring Security 特有的。 CSRF 保护通常涉及在每个 HTTP POST 请求中包含一个安全、随机生成的令牌。挑战来自于让现有的 JavaScript 库知道这个令牌以及它应该如何包含在 HTTP POST 请求中。这对任何应用程序都是一个挑战,而不仅仅是那些使用 Spring Security 的应用程序。

但是,如果您将使用无状态客户端,例如移动设备,您将无法依赖 Spring Security 将用户凭据存储在 HTTP 会话中的默认机制,因为 HTTP 请求将没有信息将它们绑定到会议。这又不是特定于 Spring 或 Spring Security 应用程序,因为约束是由客户端的性质和客户端-服务器通信而不是任何服务器端技术强加的。在这种情况下,您需要在 HTTP 标头中传递一些身份验证令牌,以便应用程序维护服务器端的安全状态。我有一个working example for this as well。如果您需要更多详细信息,网络上的文章解释了如何使用 Spring Security 执行此类操作。

【讨论】:

以上是关于如何保护 Angular.js 或 Ember.js 的 Spring RESTful Web 服务的主要内容,如果未能解决你的问题,请参考以下文章

使用 Spring Security 保护 Angular JS 应用程序

如何检测 angular.js 中的 keydown 或 keypress 事件?

如何在 Angular Js 中使用名称或 id 属性验证表单

如何使用 Angular js 或 java 脚本将逗号分隔的字符串分解为单个索引数组

如何在 jQuery 日历或 Angular Js 日历中将当前周末日期设置为默认日期。星期在星期日结束

Django:如何在 Jquery 中使用 $getJSON 或在 Angular.js 中使用 $http.get 接收 QuerySet?