我想通过令牌声明中的像
first_login
这样的布尔字段来检测用户是否在keycloak上登录,当用户第一次登录时可以将其设置为true
。我找不到任何相关的预定义映射器,也找不到用于创建新的自定义映射器的用户属性here。
有办法做到吗?
您可以使用事件侦听器 SPI 来完成此操作:
添加自定义用户属性
first_login
,其值为 true 或 false。
创建一个新的协议映射器以将此属性添加到您的令牌声明中。
实现自定义事件监听器SPI来监听用户的登录事件并修改其
first_login
属性:
public class FirstLoginEventListener implements EventListenerProvider {
private final KeycloakSession session;
public FirstLoginEventListener(KeycloakSession session) {
this.session = session;
}
@Override
public void onEvent(Event event) {
if (event.getType() == EventType.LOGIN) {
String userId = event.getUserId();
var user = session.users().getUserById(session.getContext().getRealm(), userId);
String firstLoginAttr = user.getFirstAttribute("first_login");
if (firstLoginAttr == null) {
user.setSingleAttribute("first_login", "true");
} else if (firstLoginAttr.equals("true")) {
user.setSingleAttribute("first_login", "false");
}
}
}
}