首页 > 解决方案 > 在 Keycloak 中,当 user2 尝试使用 IDP 登录页面登录时,如何自动注销(使会话过期)user1?

问题描述

我使用 Keycloak (KC) 作为 OIDC 的身份代理。

1)浏览客户端应用程序并按登录按钮

2)后台登录按钮将调用KC auth端点,该端点将显示IDP登录页面

3) User1 为登录页面添加书签并输入凭据并开始使用客户端网站

4) User1 关闭浏览器而不退出

5) 用户 2 立即出现并点击显示 IDP 登录页面的书签页面

6) User2 输入凭据并收到以下错误:

[错误信息][1][1]:https ://i.stack.imgur.com/vn83h.png

7)一旦用户按下“返回应用程序”,就会显示用户1屏幕(将用户1信息暴露给用户2)

如果用户 2 尝试直接使用 IDP 登录页面登录而没有任何问题,那么如果用户 1 的会话处于活动状态,我该如何过期。

标签: keycloakopenid-connect

解决方案


您必须实现自定义身份验证器并将其添加到 Keycloak 中的身份验证流程中。实现 Keycloak 的 Authenticator 接口。

首先,您需要获取当前用户的会话列表,如下所示:

List<UserSessionModel> userSessions = session.sessions().getUserSessions(context.getRealm(), context.getUser());

session是一个 KeycloakSession。context可以在接下来要覆盖的方法 authenticate 中访问。在这里,我们可以开始实现您正在寻找的行为:

 private void logoutOldestSession(List<UserSessionModel> userSessions) {
        logger.info("Logging out oldest session");
        Optional<UserSessionModel> oldest = userSessions.stream().sorted(Comparator.comparingInt(UserSessionModel::getStarted)).findFirst();
        oldest.ifPresent(userSession -> AuthenticationManager.backchannelLogout(session, userSession, true));
    }

不要忘记在 Keycloak 发行版的部署下部署包含此行为的 jar 文件。此外,您必须在 /META-INF/services 下引用您的身份验证器。


推荐阅读