2011-01-12 83 views
12

我托管REST Web服务在Grails应用程序获得了REST Web服务,使用Spring的安全,即:调用使用Spring Security从Android的

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

我是从Android应用程序调用它。 (呼叫无担保服务工作得很好。)

要调用服务,我手动建立一个请求(HttpUriRequest)并使用HttpClient执行它。

我想知道的最佳实践是什么,以及如何实现它们......特别是,我应该:

  1. 执行一次登录,检索JSESSION_ID,再加入含有它变成一个头每个后续请求的HttpUriRequest?
  2. 或(不知道我会怎么连这样做),包括登录并直接密码对每个请求,前述饼干/服务器端会话

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

- 兼论,没有我失踪,会做这一切对我有什么库吗? :)

回答

10

弹簧安全确实支持基本身份验证和基于表单的身份验证(在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服务试过,但我清楚地记得正是这种阅读的文档和我一样对春季安全基本页面登录同一最近。免责。

+4

感谢很多的答案,这是接近(思想帮助了很多),但没有奏效开箱即用 - 我发表了一篇关于如何运作的文章:http://storypodders.com/dasBlog/2011/01/22/SecuringRESTServicesInGrailsWithSpringSecurity。aspx – Bobby 2011-01-22 18:27:13

9

我想你可以使用一个登录,一劳永逸的获得,一个令牌,它类似于如何OAuth的工作方法。

安全信道(HTTPS/SSL)的外侧通过网络发送的用户名和密码是一种可怕的想法。网络上的任何人都可以嗅探您的请求包并查看明文密码。

在另一方面

,如果使用令牌的方法,因为该令牌字符串是随机产生的,即使令牌被攻破,最坏的情况是有人可以使用该令牌访问您的REST API。

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