使用Android的Spring Security调用REST Web服务
我使用Spring Security在Grails应用程序中托管REST Web服务,即:
@Secured(['IS_AUTHENTICATED_REMEMBERED']) def save = { println "Save Ride REST WebMethod called" }
我是从Android应用程序调用它。 (调用不安全的服务工作正常。)
为了调用该服务,我手动构建一个请求( HttpUriRequest
)并使用HttpClient
执行它。
我想知道最佳实践是什么,以及如何实现它们……具体来说,我应该:
- 执行一次登录,检索JSESSION_ID,然后为每个后续请求将包含它的标题添加到HttpUriRequest中?
- 或者(不确定我甚至会这样做)在每个请求上直接包含登录名和密码,在cookie /服务器端会话之前
我想我可以选择1工作,但我不确定Spring Security是否允许(2),如果这是要走的路……谢谢!
– 还有,我没有找到任何能够为我做这一切的图书馆吗? 🙂
Spring安全性确实支持基本身份validation和基于表单的身份validation(在URL中嵌入用户名/密码)。
REST服务通常在每个请求上进行身份validation,通常不是通过会话进行身份validation。 默认的spring安全身份validation(假设您使用的是3.x)应查找基本身份validation参数或表单参数(j_username和j_password)(格式为http://you.com/rest_service?j_username=xyz&j_password=abc )。
手动将j_username / j_password添加到URL上,将它们添加为post参数(我相信),或者设置基本身份validation用户名/密码都应该可以使用默认的Spring Security拦截器来validationREST服务。
我承认我还没有在REST服务上试过这个,虽然我确实清楚地记得在文档中读到这一点,因为我最近对Spring安全性的基本页面登录做了同样的事情。 免责声明。
我认为你可以使用类似于oauth工作方式的login-once-and-get-a-token方法。
在安全通道(https / ssl)之外的网络上发送用户名和密码是一个糟糕的主意。 网络上的任何人都可以嗅探您的请求包并查看明文密码。
另一方面,如果使用令牌方法,由于令牌字符串是随机生成的,即使令牌被泄露,最坏的情况是有人可以使用访问REST API的令牌。
另一个解决方案是通过ssl隧道(HTTPS)。 我实际做了一个比较,结果显示:80个请求/分钟(https)vs 300个请求/分钟(http)
- 服务器(Java – Cipher)和客户端之间的AES(Javascript – CryptoJS)
- 类不是抽象的,并且不会覆盖Java中的错误
- SimpleDateFormat无法解析超过4位数的毫秒数
- BufferedReader比Scanner有什么好处
- 如果Thread.sleep是静态的,那么各个线程如何知道它被置于睡眠状态?
- 如何在Java中使窗口看起来像这样?
- javafx:如何将Enter键绑定到按钮并在单击时触发事件?
- loadClass(String name)和loadClass(String name,boolean resolve)之间的区别
- JasperReports:如何在报告模板中调用java bean方法?