在相同用户登录的情况下,密钥斗篷终止会话



如果一个用户说"user1"通过一个浏览器登录到应用程序。若同一用户"user1"尝试通过同一系统或任何其他系统再次登录,则先前创建的会话应自动终止,并为该用户创建新的会话。

我们如何通过Keycloft自定义验证器来实现这一点。

我猜您必须在自定义验证器中以程序方式执行此操作。但这很棘手,因为你不希望没有被授权的人只知道他的用户名就可以终止用户的会话。因此,您必须确保凭据有效,然后删除所有会话。"最简单"的方法应该是正常进行身份验证,然后用程序删除所有会话并重新创建一个新会话。但这个要求听起来像是解决另一个问题的变通方法。。。

您可以通过Keycapture使用Events来实现这一点。只需实现您的自定义侦听器提供程序,并在事件登录时删除所有现有用户会话,而不是当前会话。

public class SessionEventListenerProvider implements EventListenerProvider {
private static final Logger logger = LoggerFactory.getLogger(SessionEventListenerProvider.class);
private final KeycloakSession session;
public SessionEventListenerProvider(KeycloakSession session) {
this.session = session;
}
@Override
public void onEvent(Event event) {
if (event.getType().equals(EventType.LOGIN)) {
RealmModel realmModel = session.getContext().getRealm();
UserModel userModel = session.users().getUserById(realmModel, event.getUserId());
logger.debug("Removing existing sessions for user {} within realm {}", userModel.getUsername(), realmModel.getName());
session.sessions().getUserSessionsStream(realmModel, userModel).forEach(userSession -> {
if (!userSession.getId().equals(event.getSessionId())) {
session.sessions().removeUserSession(realmModel, userSession);
}
});
}
}

最新更新