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

时间:2011-02-12 22:30:05

标签: ajax spring rest spring-security restful-authentication

我正在开始一个新项目,我们正计划建立一个宁静的后端和一个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服务,用户可以向其提供用户名/密码组合,然后返回安全令牌,他们必须在每次请求时将其发送回服务。安全令牌将由服务进行数字签名,并具有到期时间。该令牌仅对大多数操作有利,高安全性操作将需要新的登录屏幕作为确认操作的端口。

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

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

3 个答案:

答案 0 :(得分:10)

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

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

答案 1 :(得分:1)

您可能还想看看Jasig CAS - Web上的单点登录。它有一个REST API和一个协议(代理票证),它允许服务代理用户AuthN后端服务,就像您在选项6中描述的那样。http://www.jasig.org/cas

简单地说......提供AJAX客户端的应用程序受Spring Security(开箱即用支持CAS)的保护,并获得嵌入AJAX客户端的代理授予票证。 AJAX客户端使用PGT获取REST服务的代理票证...也受到Spring Security的保护。 REST服务获得经过身份验证的userId,而不会触及所有主要凭据。

或者,您可以将PGT保留在服务器上并使用AJAX调用来检索代理票证,然后由AJAX客户端使用它来为您调用REST服务。

答案 2 :(得分:0)

根据我的理解,您将获得一个休息应用程序,前言您必须知道安全提供程序包含三个概念(3A): -Authentication -Authorization - 审核

要将这三者结合在一起,你必须提供一堆工具,例如: -SSO提供商 - 商店 - 打开Id模式 - 用户凭证集成 ....

我使用ACL(Spring ACL)提供授权服务,使用oauth2进行身份验证。 有一个通道将这两个连接在一起及其范围(oauth2范围),但问题是范围不够灵活(纯字符串)足以实现授权模块,如role_voter,cache_strategy,black_list或Role_base策略,例外权限,white_list。 ..(但你可以使用@EnableGlobalMethodSecurity)

在我的情况下,我使用授权服务器作为oauth2身份验证服务器的资源(看看http://projects.spring.io/spring-security-oauth/docs/oauth2.html),然后我考虑了两个检查授权的位置,第一个我向前端发出ACL并强制编程动态设计她的页面直到ACL概念,第二个是在服务层(BLL)的后端使用Aspect,当一个休息将被调用时。我发送了服务密钥作为actee来检查当前用户是否有足够的访问控制来执行此操作。对于审计,您必须监控所有请求,我的意思是您必须在您的网关或经纪人中使用监听器......