在RESTful web服务中的身份验证

6
我正在基于Spring构建一个restful web服务。我使用了Spring Security。它只能被桌面应用程序访问,基本上是机器对机器的web服务。
  • 我想要一个自定义的服务来进行身份验证。然后根据身份验证的结果执行其他更敏感的操作。

  • 另一种选择是在每个请求的正文中发送凭据,并基本上每次都进行身份验证。

逻辑上说,第一种方法最有效,因为每次进行身份验证都会有相当大的开销。

关于这个问题,你建议采用无状态还是有状态的方式?有状态的方法是否存在重大缺点?

到目前为止,我已经阅读了Java Web Services Up and Running的一些章节,以及从SO中看到了一些问题,例如this

2个回答

3

按照您提供的链接所述,以REST方式进行操作是在每个请求上进行身份验证,而不是保留会话。

至于在每个请求上使用用户名/密码进行身份验证,如果您可以使用安全层(https),则是安全的;否则,该对将以明文发送并可被发现。

另一个选择是使用类似于AWS的方法进行操作(例如Amazon herehere的链接)。这里有其他解释:buzzmediasamritchie

也许OAuth是一个选项,但我没有经验。


所以,这更像是REST Web服务内部安全性的设计模式。我的问题是:这不是一种更慢、效率更低的方法吗?在基于SOAP的Web服务中,我不知道是否有避免会话的建议。完全无状态是否有明显的优势?谢谢! - Ariel Chelsău
关于性能方面:我认为计算哈希所需的少量指令或身份验证信息传输的少量字节与整体传输和请求处理时间相比,远不重要。 - jmclem
是的,请求处理时间可能会成为一个问题。我的意思是,每次传递凭据时,都需要进行数据库查找以验证用户身份。 - Ariel Chelsău
2
再说一遍:与网络传输时间相比,现代数据库请求需要多长时间? 我的猜测是:几乎没有。我会先按照REST方式正确地执行它。然后,如果速度慢,请进行分析以查看瓶颈在哪里。很可能不是用于身份验证的单个DB请求。如果是,则尝试进行优化。但要在此之前进行。 - jmclem

0

如果要开始使用REST服务(客户端-服务器),我强烈推荐您使用 Restlet

可以使用ClientResource定义对此REST服务的身份验证。例如:

private static ClientResource getClientResource(String uri) {
ClientResource clientResource = new ClientResource(uri);
clientResource.setChallengeResponse(ChallengeScheme.HTTP_BASIC,
        "username", "password"
        );
return clientResource;
}

虽然我很感谢您的建议,但我想知道在保护REST Web服务方面,每个请求都发送用户名和密码是否是可行的选择。谢谢! - Ariel Chelsău
您可以通过登录资源进行身份验证,然后仅在每个请求中检查 cookie。这至少是我们的做法。 - Gonzalo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接