Пользовательское хранилище Keycloak не отображает атрибуты - PullRequest
0 голосов
/ 03 августа 2020

Я реализовал пользовательское хранилище spi в keycloak для связи с mysql db. Все работает правильно, за исключением prticular.

Когда я go перехожу на страницу пользователей в консоли администратора и нажимаю «Просмотреть всех пользователей», извлеченные пользователи правильно отображаются со всеми полями (имя пользователя, электронная почта, фамилия, имя)

enter image description here

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

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 и некоторое время искал, но ничего полезного не нашел. Есть идеи?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...