使用Android的Spring Security调用REST Web服务

我使用Spring Security在Grails应用程序中托管REST Web服务,即:

@Secured(['IS_AUTHENTICATED_REMEMBERED']) def save = { println "Save Ride REST WebMethod called" } 

我是从Android应用程序调用它。 (调用不安全的服务工作正常。)

为了调用该服务,我手动构建一个请求( HttpUriRequest )并使用HttpClient执行它。

我想知道最佳实践是什么,以及如何实现它们……具体来说,我应该:

  1. 执行一次登录,检索JSESSION_ID,然后为每个后续请求将包含它的标题添加到HttpUriRequest中?
  2. 或者(不确定我甚至会这样做)在每个请求上直接包含登录名和密码,在cookie /服务器端会话之前

我想我可以选择1工作,但我不确定Spring Security是否允许(2),如果这是要走的路……谢谢!

– 还有,我没有找到任何能够为我做这一切的图书馆吗? 🙂

Spring安全性确实支持基本身份validation和基于表单的身份validation(在URL中嵌入用户名/密码)。

REST服务通常在每个请求上进行身份validation,通常不是通过会话进行身份validation。 默认的spring安全身份validation(假设您使用的是3.x)应查找基本身份validation参数或表单参数(j_username和j_password)(格式为http://you.com/rest_service?j_username=xyz&j_password=abc )。

手动将j_username / j_password添加到URL上,将它们添加为post参数(我相信),或者设置基本身份validation用户名/密码都应该可以使用默认的Spring Security拦截器来validationREST服务。

我承认我还没有在REST服务上试过这个,虽然我确实清楚地记得在文档中读到这一点,因为我最近对Spring安全性的基本页面登录做了同样的事情。 免责声明。

我认为你可以使用类似于oauth工作方式的login-once-and-get-a-token方法。

在安全通道(https / ssl)之外的网络上发送用户名和密码是一个糟糕的主意。 网络上的任何人都可以嗅探您的请求包并查看明文密码。

另一方面,如果使用令牌方法,由于令牌字符串是随机生成的,即使令牌被泄露,最坏的情况是有人可以使用访问REST API的令牌。

另一个解决方案是通过ssl隧道(HTTPS)。 我实际做了一个比较,结果显示:80个请求/分钟(https)vs 300个请求/分钟(http)