Java 保护有状态web服务的安全

Java 保护有状态web服务的安全,java,web-services,security,spring,spring-security,Java,Web Services,Security,Spring,Spring Security,我们正计划开发一层REST服务,以公开托管在遗留系统上的服务。这些服务将由经典的web应用程序和本地移动电话应用程序使用 这个遗留系统的安全性是这样的,即需要初始用户名+密码身份验证(这一过程可能需要5到10秒)。初始身份验证之后,将返回一个时间受限的令牌。该令牌必须包含在所有进一步的请求中,否则请求将被拒绝 由于安全性要求,遗留安全令牌不能在REST服务层之外返回。这意味着REST服务层需要在某种形式的用户会话中保留该令牌,否则每次调用遗留系统都需要重复昂贵的用户名+密码身份验证过程 REST

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

这个遗留系统的安全性是这样的,即需要初始用户名+密码身份验证(这一过程可能需要5到10秒)。初始身份验证之后,将返回一个时间受限的令牌。该令牌必须包含在所有进一步的请求中,否则请求将被拒绝

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

REST服务层将使用Java6+Spring3+SpringSecurity3堆栈实现。乍一看,这个设置似乎运行得很好:基于Spring的REST服务将使用相当标准的Spring安全配置进行保护,遗留安全令牌将存储在用户的HTTP会话中,每次调用都将使用用户的会话检索该令牌并将其发送到遗留系统

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

另一种选择是绕过REST服务层的HTTP会话,使用其他形式的用户会话,可能使用数据库,使用REST客户端通过HTTP头或简单请求查询发送的密钥来识别。接下来的问题是,如何将Spring安全性配置为使用此替代会话机制而不是标准Servlet HttpSession

我肯定不是第一个处理这种情况的人。我错过了什么


谢谢

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


使用cookie的另一种方法是将JSESSIONID放入URL中。我对spring安全性一无所知,但这似乎是至少某些类型的URL请求的默认设置,除非显式设置为true。不过,这可以被认为是一种错误。

不幸的是,身份验证问题非常严重——在web标准和浏览器实现方面有点盲点。您是对的,cookies不被认为是“RESTful”,而是纯粹主义者,但即使在功能齐全的浏览器上,避免cookies也需要相当多的黑客操作,如本文所述:

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

  • HTTP身份验证(理想情况下是“摘要”,而不是“基本”)
  • 饼干

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

同意。这就是饼干被发明的目的。使用它们我同意使用cookies是显而易见的解决方案。我想我的问题更多的是,这是将Spring的RestTemplate还是iPhone/Android/其他原生移动应用程序与后端REST服务集成的标准解决方案。例如,使用RestTemplate管理cookie不是现成的,需要额外的代码。也许还有另一个广泛使用的用户状态管理方案,我错过了。或者我只是不必要地把事情复杂化了:)