hbo*_*go1 5 openid-connect keycloak
我使用 Keycloak (KC) 作为 OIDC 的身份代理。
1) 浏览客户端应用程序并按登录按钮
2) 后台登录按钮将调用 KC 身份验证端点,该端点将显示 IDP 登录页面
3) User1 将登录页面添加为书签并输入凭据并开始使用客户端网站
4) User1 关闭浏览器而不注销
5) User2 立即出现并点击显示 IDP 登录页面的书签页面
6) User2 输入凭据并收到以下错误:
[错误消息][1][1]:https://i.stack.imgur.com/vn83h.png
7)一旦用户按下“返回应用程序”,就会显示 user1 屏幕(这会将 user1 信息公开给 user2)
当 user2 尝试直接使用 IDP 登录页面登录而没有任何问题时,如果 user1 的会话处于活动状态,我如何才能使 user1 的会话过期?
小智 0
您必须实现自定义身份验证器并将其添加到 Keycloak 中的身份验证流程中。实现Keycloak的Authenticator接口。
首先,您需要获取当前用户的会话列表,如下所示:
List<UserSessionModel> userSessions = session.sessions().getUserSessions(context.getRealm(), context.getUser());
Run Code Online (Sandbox Code Playgroud)
session是一个KeycloakSession。可以context在您接下来要重写的方法内部访问。在这里我们可以开始实现您正在寻找的行为:
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));
}
Run Code Online (Sandbox Code Playgroud)
不要忘记在 Keycloak 发行版的部署下部署包含此行为的 jar 文件。另外,您必须在 /META-INF/services 下引用您的身份验证器。
| 归档时间: |
|
| 查看次数: |
5498 次 |
| 最近记录: |