我在寻找最好的设计来保护后端。这里是我考虑的设计清单。我正在寻找下面没有列出的替代设计,优点,缺点建议。系统将使用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服务,用户可以向其显示其用户名/密码组合,然后返回和安全令牌,他们必须在每次请求时将其发送回服务。安全令牌将由服务进行数字签名,并且将具有到期时间。令牌将仅对大多数操作有好处,高安全性操作将需要新的登录屏幕作为确认操作的端口。
这种方法的问题是,我必须发明另一个安全协议,似乎总是浪费时间。
我相信我不是唯一的人反对这个问题,我希望堆栈溢出社区可以指向一些我还没有找到的选项和工具。
或者你可以使用Spring Security(或Shiro)与记住我cookie,它是在webapps共享的(只要它们在同一个HTTP域中)。记住我的cookie将类似于你的令牌在选项6中。你可以设置cookie的过期,所以它是短暂的像会话cookie或长期像常规记得我。