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

时间:2011-01-12 00:53:37

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

我使用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 /服务器端会话
  3. 我想我可以让选项1工作,但我不确定Spring Security是否允许(2),如果这是要走的路......谢谢!

    - 另外,我没有找到任何可以为我做这一切的图书馆吗? :)

2 个答案:

答案 0 :(得分:10)

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

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

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

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

答案 1 :(得分:9)

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

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

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

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