gpt4 book ai didi

java - Keycloak 自定义用户存储不显示属性

转载 作者:行者123 更新时间:2023-12-04 14:12:25 24 4
gpt4 key购买 nike

我已经在 keycloak 中实现了一个自定义用户存储 spi,用于与 mysql db 进行通信。除了特定的之外,它都以正确的方式工作。
当我转到管理控制台中的用户页面并单击查看所有用户时,检索到的用户将正确显示所有字段(用户名、电子邮件、姓氏、名字)
enter image description here
从上图可以看出,前两个用户是直接从 keycloak 创建的,后两个用户是从 mysql 数据库中获取的。
相反,当我在打开的页面中单击单个用户时,除用户 ID 和用户名之外的所有字段都是空的。
enter image description here
我不明白为什么在 View 中所有页面这些数据都正确显示,而在单用户页面中却没有。我想这是因为 kecloak 试图从它自己的存储中读取数据,因为

  • 如果我使用自定义值将其设置为单个用户页面中的电子邮件字段并将其保存
  • 碰巧在查看所有页面中,电子邮件具有图像中的值 (m.c...@hotmail.it )
  • 并且在单用户页面中它有另一个值(我保存的自定义值)。

  • 因为存储是使用这个 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);
    }
    }

    我阅读了文档并搜索了一段时间,但没有发现任何有用的信息。有任何想法吗?

    最佳答案

    我认为这可能与您的提供商的用户查找优先级和缓存有关。
    尝试将您的提供者的配置(管理控制台 > 用户联合 > 您的提供者)优先级编辑为低于 0 的值(注意其他提供者的配置和优先级),以便它首先在您的自定义提供者中进行查找。
    此外,您可能想要检查缓存策略值,尝试将其设置为 NO_CACHE 或为 MAX_LIFESPAN 组合框设置一个值。

    关于java - Keycloak 自定义用户存储不显示属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63231056/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com