Java 从Android调用使用Spring安全性保护的REST web服务

Java 从Android调用使用Spring安全性保护的REST web服务,java,web-services,spring,rest,spring-security,Java,Web Services,Spring,Rest,Spring Security,我正在Grails应用程序中使用Spring Security托管REST web服务,即: @Secured(['IS_AUTHENTICATED_REMEMBERED']) def save = { println "Save Ride REST WebMethod called" } 我在安卓应用程序中调用它。(调用不安全的服务就可以了。) 要调用该服务,我需要手动构建一个请求(HttpUriRequest),并使用HttpClient执行它 我想知道什么是最佳实践,以及如何实施

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

@Secured(['IS_AUTHENTICATED_REMEMBERED'])
def save = {
    println "Save Ride REST WebMethod called"
}
我在安卓应用程序中调用它。(调用不安全的服务就可以了。)

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

我想知道什么是最佳实践,以及如何实施它们。。。具体而言,我是否应该:

  • 执行一次登录,以检索JSESSION_ID,然后为每个后续请求将包含该ID的头添加到HttpUriRequest中
  • 或者(我甚至不知道该怎么做)在每个请求中直接包含登录名和密码,在cookie/服务器端会话之前
  • 我想我可以让选项1工作,但不确定Spring Security是否允许(2),如果这样做的话。。。谢谢

    --此外,我还不知道还有什么图书馆可以为我做这些,是吗?:)

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

    REST服务通常在每个请求上进行身份验证,而不是通过会话进行身份验证。默认的spring安全身份验证(假设您在3.x上)应该查找基本身份验证参数或表单参数(j_用户名和j_密码)(在表单中)

    手动将j_用户名/j_密码固定到URL上,将它们添加为post参数(我相信),或者设置基本的身份验证用户名/密码都可以根据默认的Spring安全拦截器立即对REST服务进行身份验证


    我承认,我还没有在REST服务上尝试过这一点,尽管我确实清楚地记得在文档中读到过这一点,就像我最近在spring security上对基本页面登录所做的一样。免责声明结束。

    我认为您可以使用类似于oauth工作方式的登录一次并获取令牌方法

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

    另一方面,如果您使用令牌方法,因为令牌字符串是随机生成的,即使令牌被破坏,最坏的情况是有人可以使用令牌访问您的RESTAPI


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

    非常感谢你的回答,这很接近(这些想法帮助很大),但不是开箱即用的-我发表了一篇关于如何使其工作的帖子:这是一篇很棒的帖子,感谢你的贡献,我相信它会被发现并对很多人有用。在URL中输入用户名和密码通常被认为是个坏主意。Web服务器日志文件通常包含将公开您的凭据的查询参数。任何从浏览器访问RESTful服务的人都会在其历史记录中公开凭据。