如何为Angular.js和Ember.js保护Spring RESTful Web服务

时间:2014-02-06 21:31:04

标签: spring rest ember.js spring-security restful-authentication

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

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

如何将用户登录身份验证绑定到RESTful Web服务的身份验证?换句话说,我想这样做只有在用户登录后才能访问RESTful Web服务。这样,Angular.js和Ember.js库就可以从我的用户页面安全地访问这些RESTful Web服务没有其他人可以直接打电话给他们。

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

1 个答案:

答案 0 :(得分:11)

当然,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的应用程序。

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