Я реализовал пользовательское хранилище spi в keycloak для связи с mysql db. Все работает правильно, за исключением prticular.
Когда я go перехожу на страницу пользователей в консоли администратора и нажимаю «Просмотреть всех пользователей», извлеченные пользователи правильно отображаются со всеми полями (имя пользователя, электронная почта, фамилия, имя)
![enter image description here](https://i.stack.imgur.com/2ry0m.png)
From the upper image the firt two users were created directly from keycloak, the last two were retrived from the mysql db.
instead when i click on the single user in the opened page all the fields except for the user id and the username are empty.
![enter image description here](https://i.stack.imgur.com/pK0hZ.png)
I don't understand why in the view all page this datas are displayed correctly and in the single user page not. I suppose that is because kecloak tries to read the datas from it's own storage because
- if i set this for ex the email field in the single user page with custom value and save it
- happens that in the view all page the email has the value in the image (m.c...@hotmail.it )
- and in the single user page it has another value ( the custom one that i saved ).
As storage is use this one https://github.com/Linch1/mysql-keycloak-storage-spi написано мной (основной логин находится в папке jar-module). Я думаю, что главным героем этого поведения является файл UserAdapter. java, в моем я написал это:
package mysql.storage.main;
import org.keycloak.component.ComponentModel;
import org.keycloak.models.KeycloakSession;
import org.keycloak.models.RealmModel;
import org.keycloak.storage.StorageId;
import org.keycloak.storage.adapter.AbstractUserAdapterFederatedStorage;
import lombok.extern.jbosslog.JBossLog;
import mysql.storage.entity.User;
@JBossLog
public class UserAdapter extends AbstractUserAdapterFederatedStorage {
private final User user;
private final String keycloakId;
public UserAdapter(KeycloakSession session, RealmModel realm, ComponentModel model, User user) {
super(session, realm, model);
this.user = user;
this.EMAIL_ATTRIBUTE = user.getEmail();
this.keycloakId = StorageId.keycloakId(model, String.valueOf(user.getId()) );
}
@Override
public String getId() {
return keycloakId;
}
@Override
public String getUsername() {
log.infov("\n UserAdapter > getting username: " + user.getNickName() );
return user.getNickName();
}
@Override
public void setUsername(String username) {
user.setNickName(username);
}
@Override
public String getEmail() {
log.infov("\n UserAdapter > getting email: " + user.getEmail() );
return user.getEmail();
}
@Override
public void setEmail(String email) {
user.setEmail(email);
}
@Override
public String getFirstName() {
return user.getFirstName();
}
@Override
public void setFirstName(String firstName) {
user.setFirstName(firstName);
}
@Override
public String getLastName() {
return user.getLastName();
}
@Override
public void setLastName(String lastName) {
user.setLastName(lastName);
}
}
Я прочитал do c и некоторое время искал, но ничего полезного не нашел. Есть идеи?