我使用Spring Security在Grails应用程序中托管REST Web服务,即:
@Secured(['IS_AUTHENTICATED_REMEMBERED'])
def save = {
println "Save Ride REST WebMethod called"
}
我是从Android应用中调用的。 (调用不安全的服务工作正常。)
要调用该服务,我手动构建请求(HttpUriRequest
)并使用HttpClient
执行该操作。
我想知道最佳做法是什么,以及如何实施它们......具体来说,我应该:
我想我可以让选项1工作,但我不确定Spring Security是否允许(2),如果这是要走的路......谢谢!
- 另外,我没有找到任何可以为我做这一切的图书馆吗? :)
答案 0 :(得分: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安全性的基本页面登录做了同样的事情。免责声明。
答案 1 :(得分:9)
我认为你可以使用类似于oauth工作方式的login-once-and-get-a-token方法。
在安全通道(https / ssl)之外的网络上发送用户名和密码是一个糟糕的主意。网络上的任何人都可以嗅探您的请求包并查看明文密码。
另一方面,如果使用令牌方法,由于令牌字符串是随机生成的,即使令牌被泄露,最坏的情况是有人可以使用访问REST API的令牌。
另一种解决方案是通过ssl隧道(HTTPS)。我实际做了一个比较,结果显示:80个请求/分钟(https)vs 300个请求/分钟(http)