ajax - 如何为 REST 后端/Ajax 前端应用程序设计认证和授权系统

标签 ajax spring rest spring-security restful-authentication

我正在开始一个新项目,我们计划在其中构建一个 Restful 后端和一个 AJAX 字体端。我通过专注于识别我拥有的所有资源以及各种 HTTP 动词将做什么、它们的 URI 和这些资源的 JSON 表示来解决这个问题。

我正在寻找保护后端的最佳设计。这是我考虑过的设计列表。我正在寻找下面未列出的替代设计,以及优缺点建议。系统将使用 Spring 3.0 和可能的 Spring Security 3.0 实现,SSL 将用于系统的许多部分,但不是全部,因此一些请求可能来自 SSL,而另一些可能不会。

选项 1:使用 HTTP session

显示标准登录屏幕,创建服务器端 session 并让 tomcat 发回 jsessionid cookie,并让 ajax 客户端在每个 XHR 请求中包含 JSESSIONID cookie。由于以下原因,这个选项只是感觉它是错误的方法。

  • 连接变为有状态的,这违反了 REST 规则
  • 我希望能够将 bakcend 拆分为多个单独的 WAR 文件,这意味着我可以在后端有多个 HTTP session ,如果是这种情况,那么这种方法不起作用。虽然我现在不需要将后端拆分为多个应用程序的能力,但我更喜欢允许这种可能性的设计。

选项 2:找到一个基于 Java 的开源安全库来执行此操作

除了 Spring security 我没有找到任何其他 Java 库,任何建议都非常感谢。

选项 3:尝试使用现有协议(protocol),如 OAuth

在我对 OAuth 的简要介绍中,它似乎是为跨站点进行身份验证而设计的,每个站点都有自己的用户数据库。在这个系统中,我想要一个在所有后端 ajax 服务之间共享的全局用户数据库。

选项 4:使用 SAML 和 Shiboleth

这个选项似乎过分了,而且设置和维护起来非常复杂。

选项 5:在每个请求中发送用户名和密码

这要求用户在每次请求时都发送他们的用户名和密码,这意味着前端 AJAX 应用程序必须将用户名和密码存储为 JavaScript 对象,如果用户离开页面,则返回用户名/密码组合将消失,用户可能会被迫再次登录。我不希望前端尝试将用户名和密码放入 cookie,因为这会构成安全性。

选项 6:实现我自己的身份验证/授权协议(protocol)

创建一个 REST 服务,用户可以向该服务提供他们的用户名/密码组合,然后取回安全 token ,他们必须在每次请求时将其发送回服务。安全 token 将由服务进行数字签名,并具有到期时间。该 token 仅适用于大多数操作高安全性操作将需要一个新的登录屏幕作为确认操作的端口。

这种方法的问题是我必须发明另一种安全协议(protocol),这似乎完全是浪费时间。

我确信我不是唯一一个遇到这个问题的人,我希望堆栈溢出社区可以指出一些我还没有找到的选项和工具。

最佳答案

看看Apache Shiro .它是一种身份验证系统,具有 session 管理功能,可用于跨应用程序共享 session 。这可能是最容易做到的事情。

或者您可以使用 Spring Security(或 Shiro)和一个在 webapps 之间共享的 Remember Me cookie(只要它们在同一个 HTTP 域中)。记住我 cookie 类似于选项 6 中的 token 。您可以在 cookie 上设置过期时间,使其像 session cookie 一样短暂,或者像普通记住我一样长期存在。

关于ajax - 如何为 REST 后端/Ajax 前端应用程序设计认证和授权系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4981045/

相关文章:

Spring jdbc 'select for update'

java - 我如何使用 spring-ws 从网络服务获取 SOAP 附件

javascript - dijit.form.ComboBox 无法与 dojox.data.JsonRestStore 一起使用

javascript - Jquery 手机 : Select menus events

java - Jsp header 中的用户名

jquery - 使用 jquery 的 ajax 调用中未设置 HTTP_X_REQUESTED_WITH

java - 在 Spring Boot 中处理剩余 Controller 中的异常

javascript - 检查 JSON 对象是否存在( postman )

java - 如何从标签列表获取对象属性到 JavaScript 变量?

php - 使用 ajax、jquery 和 PHP 更新数据库中的图像不起作用