Spring KeycloakOIDCFilter 过滤器在帐户从其他应用程序注销时使会话无效

问题描述 投票:0回答:1

我的 spring(wicket)应用程序(

ApplicationA
)正在通过 keycloak 过滤器使用来自另一个应用程序的身份验证。 一切都运转良好。 当我从我的应用程序 (
ApplicationA
) 注销时,我的其他应用程序 (
ApplicationB
ApplicationC
) 也会被注销。
ApplicationB
ApplicationC
都使用 React Keyloak 组件,这就是它们自动注销的原因。

但是,对于

ApplicationA
,它不使用React Keycloak或react。我只是使用 keycloak servlet 过滤器适配器和 keycloak 身份验证客户端。

通常,当我打开

ApplicationA
的不同页面(在不同的浏览器选项卡中)并在一个选项卡中注销
ApplicationA
时,当我尝试重新加载另一个选项卡甚至调用另一个页面时...它会被重定向到登录页面和会话失效。

问题

我的问题

ApplicationA
,当帐户从其他应用程序(
ApplicationB
ApplicationC
)注销时......它不会从
ApplicationA
注销。

它似乎只是不允许刷新该会话,因此需要一些时间才能使其失效。

我的目标是,当帐户从其他应用程序注销时...当我尝试打开任何页面,甚至重新加载

ApplicationA
中的任何页面时...会话将失效,我将被重定向到登录页面页。

顺便说一句,登录页面来自另一个 keycloak 应用程序 (

AuthenticationApplication
)。 登录时会跳转到
AuthenticationApplication
的登录页面。 身份验证成功后,它会将我重定向回调用应用程序。

所以,我期望当帐户从

ApplicationB
ApplicationC
注销时...并且我从
ApplicationA
调用或重新加载任何页面...会话将结束,并将我重定向到登录页面
AuthenticationApplication

目前,我必须空闲几分钟,当我尝试调用其他页面或刷新页面时...会话结束并将我重定向到

AuthenticationApplication
的登录页面。

如果我不必在会话失效并重定向到登录页面之前等待一段时间,那就太好了。

pom.xml 更改

    <dependency>
      <groupId>org.keycloak</groupId>
      <artifactId>keycloak-servlet-filter-adapter</artifactId>
      <version>10.0.2</version>
    </dependency>

    <dependency>
      <groupId>org.keycloak</groupId>
      <artifactId>keycloak-authz-client</artifactId>
      <version>10.0.2</version>
    </dependency>

web.xml

    <filter>
      <filter-name>keycloak</filter-name>
      <filter-class>org.keycloak.adapters.servlet.KeycloakOIDCFilter</filter-class>
    </filter>

    <filter-mapping>
      <filter-name>keycloak</filter-name>
      <url-pattern>/*</url-pattern>
    </filter-mapping>

如果我想获取当前的token,我通常会这样做:

    ServletWebRequest request = (ServletWebRequest) RequestCycle.get().getRequest();
    HttpServletRequest containerRequest = request.getContainerRequest();
    m_keycloakSecurityContext = (RefreshableKeycloakSecurityContext) containerRequest.getAttribute(KeycloakSecurityContext.class.getName());

    String myToken = null;
    String myEmail = null;
    if (m_keycloakSecurityContext != null) {
        myToken = m_keycloakSecurityContext.getTokenString();
        myEmail = m_keycloakSecurityContext.getToken().getEmail();
    }

即使该帐户从其他应用程序注销,我注意到

m_keycloakSecurityContext
仍然存在,并且我仍然可以获得令牌,因此会话在ApplicationA中仍然存在。

我想知道当我尝试从请求中获取 keycloak 安全上下文时我需要做什么才能使会话无效......而不是等待失效的时间。

更新

问题不在我的代码上,只是

AuthenticationApplication
找不到
ApplicationA
。将
ApplicationA
添加到
/etc/hosts
AuthenticationApplication
后,现在可以向
/k_logout
发送
ApplicationA
请求。

ApplicationA
无需任何更改,一切正常。

很抱歉认为问题出在

ApplicationA
,发布的配置有效(取决于您的应用程序需求,但对我来说它按预期工作)。

我不会删除这篇文章,也许其他人也会有同样的问题。

spring keycloak wicket
1个回答
0
投票

我的项目也遇到了类似的情况。 我添加了一个端点来在初始页面加载时刷新令牌。

您可以使用您的

context.refreshExpiredToken(false)
拨打
RefreshableKeycloakSecurityContext
false
标志表示不检查当前令牌有效性并强制从keycloak刷新。

正如医生所说:

@return true 如果 accessToken 处于活动状态或已成功刷新

因此,如果您得到

false
,您就知道您的用户不再连接。 您可以在刷新失败时添加
session.invalidate()
request.logout()
(我不确定是否有必要)。

© www.soinside.com 2019 - 2024. All rights reserved.