从Android调用使用Spring Security保护的REST Web服务

12

我正在一个Grails应用程序中托管一个REST web服务,使用Spring Security,即:

@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),如果那是正确的方式... 谢谢!

-- 另外,我是否漏掉了任何可以为我完成所有这些工作的库? :)

2个回答

10

Spring Security支持基本认证和基于表单的认证(将用户名/密码嵌入URL中)。

REST服务通常在每个请求中进行身份验证,而不是通过会话来验证。默认的Spring Security认证(假设您正在使用3.x版本),应该查找基本身份验证参数或表单参数(j_username和j_password)(在表单中http://you.com/rest_service?j_username=xyz&j_password=abc)。

手动将j_username/j_password添加到URL上,将它们作为post参数添加(我相信),或设置基本身份验证用户名/密码都可以轻松地对REST服务进行身份验证,可以直接使用Spring Security截取器进行配置。

我承认我没有在REST服务上尝试过此操作,但我清楚地记得最近在Spring Security的基本页面登录中读到了类似的文档。免责声明结束。


4
非常感谢您的回答,这很接近(这些想法帮了我很大忙),但是并不能立即奏效 - 我在以下网址发布了一篇文章,说明了如何让它运行起来:http://storypodders.com/dasBlog/2011/01/22/SecuringRESTServicesInGrailsWithSpringSecurity.aspx - Bobby
那是一篇很棒的文章,感谢您的贡献,我相信它会被许多人发现并且有用。 - David Parks
12
将用户名和密码放在URL中通常被认为是一个不好的做法。Web服务器日志文件经常包含查询参数,这会暴露您的凭据。任何从浏览器访问您的RESTful服务的人都会在他们的历史记录中暴露凭据。 - Patrick

9

我认为你可以使用一种类似于oauth的登录后仅需获取一次token的方法。

通过网络传送用户名和密码是不安全的,除非在一个已经被保护的渠道(https/ssl)内。如果在网络上发送这样的请求,任何人都可以嗅探到你的请求包并看到明文密码,这是非常危险的。

相反,如果你使用token方法,由于token字符串是随机生成的,即使token被泄露,最坏的情况也只是有人可以使用token访问你的REST API。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接