提问者:小点点

在Keyclock中,当user2尝试使用IDP登录页面登录时,如何自动注销(终止的会话)user1?


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

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

2) 后台登录按钮将调用KC认证endpoint,该endpoint将显示IDP登录页面

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

4)用户1在未退出时关闭浏览器

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

6)用户2输入凭据,并得到以下错误:

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

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

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


共1个答案

匿名用户

您必须实现一个自定义验证器,并将其添加到Keyclock中的身份验证流中。实现Keyclok的Authenticator接口。

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

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

会话是一个键盘会话。上下文可以在您接下来要覆盖的方法身份验证中访问。在这里,我们可以开始实现您正在寻找的行为:

 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));
    }

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