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

Bob*_*bby 12 java rest spring web-services spring-security

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

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

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

要调用该服务,我手动构建一个request(HttpUriRequest)并使用一个执行它HttpClient.

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

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

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

- 而且,没有任何我想念的图书馆会为我做这一切吗?:)

Dav*_*rks 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安全性的基本页面登录做了同样的事情.免责声明.

  • 将用户名和密码放在URL中通常被认为是个坏主意.Webserver日志文件通常包含会泄露凭据的查询参数.从浏览器访问RESTful服务的任何人都会在其历史记录中显示凭据. (12认同)
  • 非常感谢答案,这很接近(这些想法很有帮助),但没有开箱即用 - 我发了一篇关于它如何工作的帖子:http://storypodders.com/dasBlog/ 2011/01 /第22/SecuringRESTServicesInGrailsWithSpringSecurity.aspx (4认同)

lig*_*ave 9

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

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

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

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