gpt4 book ai didi

java - 如何强制对 REST 中的每个请求进行身份验证?

转载 作者:行者123 更新时间:2023-11-30 11:26:20 25 4
gpt4 key购买 nike

我的理解是 RESTful 服务应该是完全无状态的。每次调用该服务时,我都必须传递它正常运行所需的所有信息。

但是,当谈到身份验证时,我对它应该如何工作感到相当困惑,尤其是在 session 管理方面。

我正在使用基本身份验证,第一次发出请求时,客户端会受到挑战(或者我可以从头开始在 header 中传递身份验证信息)。但是一旦用户通过身份验证,只要 session 处于 Activity 状态,服务器就不会再挑战该客户端。

这意味着我需要为当前用户提供一些机制来注销(终止他/她的 session )。

看起来正确的做法是以某种方式更改我的配置,以便对每个请求进行身份验证挑战,但我不知道这与 session 管理有何关系。

  • 我是否应该在每次请求后手动使 session 失效?
  • 或者是否有办法强制客户在每次提出请求时都接受挑战?

您可以在那里找到很多关于 REST 安全性的问题,甚至还有关于如何实现不同身份验证模型的书籍。但是我还没有找到关于如何处理 session 管理、登录和注销的好答案。所以要么我做错了什么,要么我误解了这里重要的事情。

我将不胜感激关于如何正确处理此问题的任何想法或指导。

我正在使用 Jersey 2.4 和 Tomcat 7。

最佳答案

如果您使用 HTTP Basic 进行身份验证,客户端第一次受到质询只是因为授权 header 不是从客户端发送的。一旦它被发送并且服务器发送了 401 以外的内容,客户端就会缓存这些凭据并在每个请求中重新发送它们。

您不应该在无状态应用程序中创建 session ,不仅因为它们未被使用,而且因为它们需要开销来管理(即使是空的)。然而,servlet 架构无法阻止代码创建 session ,例如当代码调用 httpServletRequest.getSession()httpServletRequest.getSession(true) 时。因此,您需要确保不使用执行此操作的任何代码(或框架)。

有趣的是,Tomcat 仍会生成一个 JSESSIONID cookie 供客户端使用,并且在容器的大多数配置下,您无法将其关闭。但是,如果未创建 session ,则该 cookie 基本上会被忽略(每个请求都会生成一个新的 JSESSIONID cookie)。

而且,因为该应用程序是无状态的,所以没有登录或注销的概念。所有身份验证均按请求完成。

请注意,根据您的特定应用,实用主义可能胜过纯粹的 RESTfulness。在某些情况下,“一点点”服务器状态确实是为应用程序提供某些类型安全性的唯一方法(例如跨站点请求伪造、任何带有 nonce 的东西等)

关于java - 如何强制对 REST 中的每个请求进行身份验证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19841183/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com