我在Tomcat 7中部署了几个应用程序,并使用Keycloak来管理这些应用程序的用户登录和注销。注销不起作用,即不会将用户注销并重定向到 Keycloak 的登录页面。然后我发现 JSESSIONID cookie 仍然存在,一旦我删除了 JSESSIONID cookie,注销链接就会按预期工作。所以我试图通过放置
来禁用Tomcat的 session<%@ page session="false" %>
在我的应用程序的 JSP 页面的标题中。不幸的是,这似乎仍然没有禁用 Tomcat 的 session ,我仍然看到 JSESSIONID cookie 存在。我想知道是否有人可以解决这个问题?我相信 Tomcat session 的存在会干扰 Keycloak 的 SSO session ,并导致 Keycloak 注销无法正常工作。这一定是 Keycloak 用户遇到的一个常见问题,Tomcat 被广泛用于 Web 应用程序。
如有任何关于如何处理此问题的提示,我们将不胜感激!
最佳答案
我没有使用 Keycloak 的具体经验,但是,有一个原则适用于大多数(如果不是全部)单点登录(或外部身份验证)解决方案:
SSO 可识别用户并消除典型应用程序中了解密码的负担。当用户登录时,应用服务器通常与实际的 SSO 系统分离,因此一旦用户被识别,它就需要缓存用户,就像用户通过经典登录识别自己一样。
在注销方面,您可以注销应用程序本身(在本例中为 tomcat),也可以注销 SSO 系统(这似乎就是您在这里所做的)。使用后一种方法,您会遇到“单点注销”的问题:注销 SSO 系统应该会使所有曾经通过关联登录启动的 session 失效。据我所知,SSO 系统需要跟踪所有通过它登录的系统并在那里触发显式注销。
我无法告诉您如何在 Keycloak 中实现这一点,但希望一般原则有助于指导您找到解决方案:
在 Tomcat 端使用或不使用 session 与问题无关:除了登录用户之外,您可能还有在 session 中合法存储信息的应用程序 - 这些应用程序应该继续工作,即使你不是在 tomcat 本身比较密码。
编辑,在您发表评论后:
如果这个页面不触发 session 的使用,任何其他代码(例如处理您的登录的代码)仍然可能触发 session ,然后委托(delegate)给不想使用 session 的页面.
我希望您必须在 Tomcat 的配置中禁用 session ,例如通过提供自定义 "Manager" implementation .看起来默认的不希望您完全忽略 session 。正如我在上面概述的那样,即使您没有通过 Tomcat 本身登录,我也希望 session 是必需的。
另一种避免 session 的方法(这就是为什么我不希望“无 session ”配置起作用的原因)是避免在请求/响应上调用任何会触发自动创建 session 的方法。而且您的应用程序中似乎有这样的方法。
(如果我错了有人纠正我。这主要是我的教育期望,因为我从未看过这个要求)
关于session - Tomcat 禁用 session 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46306486/