保护有状态的Web服务

时间:2011-02-06 05:12:40

标签: java web-services security spring spring-security

我们正计划开发一层REST服务,以公开遗留系统上托管的服务。这些服务将由经典的Web应用程序和本机移动电话应用程序使用。

此遗留系统的安全性使得需要初始用户名+密码身份验证(此过程可能需要5到10秒)。初始身份验证后,将返回时间受限的令牌。然后,此令牌必须包含在所有其他请求中,否则请求将被拒绝。

由于安全性要求,无法在REST服务层之外返回旧版安全令牌。这意味着REST服务层需要将此令牌保留在某种形式的用户会话中,否则每次调用遗留系统时都需要重复昂贵的用户名+密码身份验证过程。

REST服务层将使用Java 6 + Spring 3 + Spring Security 3堆栈实现。乍一看,看起来这个设置运行正常:基于Spring的REST服务将使用相当标准的Spring Security配置进行保护,旧的安全令牌将存储在用户的HTTP会话中,并且每个调用都将使用用户的会话并将其发送到旧系统。

但问题在于:REST客户端将如何发送必要的数据,以便正确检索用户的HTTP会话?这通常由Web浏览器使用JSESSIONID cookie透明地完成,但此过程中不涉及任何浏览器。当然,REST客户端可以在其代码中添加cookie管理,但对于所有Spring RestTemplate,iPhone,BlackBerry和Android客户端来说,这是一项简单的任务吗?

替代方法是绕过REST服务层的HTTP会话并使用其他形式的用户会话,可能使用数据库,使用REST客户端通过HTTP标头发送的某个密钥或简单的请求查询。接下来的问题是,Spring Security如何配置为使用这种备用会话机制而不是标准的Servlet HttpSession?

当然,我不是第一个处理这种情况的人。我错过了什么?

谢谢!

2 个答案:

答案 0 :(得分:3)

没有什么神奇的饼干。他们只是strings in HTTP headers。任何体面的客户端API都可以处理它们,尽管许多客户端API需要显式配置来启用cookie处理。

使用cookie的另一种方法是将JSESSIONID放入URL中。我对spring-security一无所知,但看起来这实际上是至少某些类型的URL请求的默认值,除非disable-url-rewriting显式设置为true。不过,这可以被视为s ecurity weakness

答案 1 :(得分:2)

不幸的是,身份验证很成问题 - 在Web标准和浏览器实现方面有点盲点。你是对的,因为cookie不被认为是“RESTful”而是纯粹主义者,但即使在功能齐全的浏览器上,也避免了相当多的hackery,如本文所述:Rest based authentication

不幸的是我没有做任何移动开发,所以我不能建议最好的妥协是什么。您可能希望首先检查每个目标平台 支持哪些身份验证模型。特别是,两个主要选项是:

  • HTTP身份验证(理想情况下为“摘要”,而非“基本”)
  • 缓存

一种可能性是提供两个选项。从技术或安全的角度来看,显然不是理想的,但在可用性方面可能有优点。