如何为REST后端/ Ajax前端应用程序设计身份验证和授权系统

ams*_*ams 26 ajax rest spring restful-authentication spring-security

我正在开始一个新的项目,我们计划构建一个宁静的后端和一个AJAX字体结束.我正在通过专注于识别我拥有的所有资源以及各种HTTP动词将执行它们,它们的URI以及这些资源的JSON表示来解决问题.

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

选项1:使用HTTP会话

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

  • 连接变为statefull,这违反了REST的规则
  • 我希望能够将bakcend分成多个单独的WAR文件,这意味着我可以在后端有多个HTTP会话,如果是这种情况,那么这种方法不起作用.虽然我今天不需要将后端分成多个应用程序的能力,但我更倾向于采用允许这种可能性的设计.

选项2:找到一个基于Java的开源安全库来实现这一目标

除了Spring安全性之外,我还没有找到任何其他Java库,任何建议都受到高度赞赏.

选项3:尝试使用OAuth等现有协议

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

选项4:使用SAML和Shiboleth

这个选项看起来过于苛刻,而且设置和维护非常复杂.

选项5:每次请求都会发送用户名和密码

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

选项6:实施我自己的身份验证/授权协议

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

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

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

sou*_*ica 11

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

或者您可以将Spring Security(或Shiro)与在Web应用程序中共享的Remember Me cookie一起使用(只要它们位于同一HTTP域中).记住我的cookie类似于你在选项6中的令牌.你可以设置cookie的到期时间,这样它就像会话cookie一样短暂存在,或者像常规记忆我一样长寿.