我们正计划开发一层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?
当然,我不是第一个处理这种情况的人.我想念什么?
谢谢!
解决方法:
Cookie没有什么神奇之处.它们只有strings in HTTP headers.任何体面的客户端API都可以处理它们,尽管许多需要显式配置才能启用Cookie处理.
使用cookie的替代方法是将JSESSIONID放入URL.我对spring-security一无所知,但似乎实际上这是至少某些类型的URL请求的默认值,除非disable-url-rewriting显式设置为true.不过,这可以视为security weakness.
标签:spring-security,security,web-services,spring,java
来源: https://codeday.me/bug/20191023/1913707.html