首页 > 解决方案 > 有没有办法在 Keycloak 中配置 storageProviderTimeout?

问题描述

我开发了一个用户存储 SPI的实现,它调用遗留系统中的 API 来迁移用户。我需要配置我自己的值,storageProviderTimeout因为很可能需要比默认的 3 秒更长的时间才能获得响应。我已经将socket-timeout-millis超时时间配置为超过默认的 5 秒,但这无济于事,因为storageProviderTimeout默认值为 3 秒。在查看 Keycloak 源代码时,特别AbstractStorageManager.java提到了这个值是可配置的:

    /**
     * Timeouts are used as time boundary for obtaining models from an external storage. Default value is set
     * to 3000 milliseconds and it's configurable.
     */
    private static final Long STORAGE_PROVIDER_DEFAULT_TIMEOUT = 3000L;

读取配置值的函数如下所示:

    protected Long getStorageProviderTimeout() {
        if (storageProviderTimeout == null) {
            storageProviderTimeout = Config.scope(configScope).getLong("storageProviderTimeout", STORAGE_PROVIDER_DEFAULT_TIMEOUT);
        }
        return storageProviderTimeout;
    }

创建UserStorageManager实例时(它扩展AbstractUserManager了构造函数,使用以下代码实例化超类:

    public UserStorageManager(KeycloakSession session) {
        super(session, UserStorageProviderFactory.class, UserStorageProvider.class,
                UserStorageProviderModel::new, "user");
    }

"user"稍后Config.scope()getStorageProviderTimeout()函数中传递给的内容在哪里。

到目前为止,我尝试的是在与标签相同的级别手动添加<user>标签standalone-ha.xml<theme>如下所示:

            <user>
                <storageProviderTimeout>10000</storageProviderTimeout>
            </user>

但是在启动 Keycloak 时,我收到此错误:

10:55:59,730 ERROR [org.jboss.as.server] (Controller Boot Thread) WFLYSRV0055: Caught exception during boot: org.jboss.as.controller.persistence.ConfigurationPersistenceException: WFLYCTL0085: Failed to parse configuration
        at org.jboss.as.controller@15.0.1.Final//org.jboss.as.controller.persistence.XmlConfigurationPersister.load(XmlConfigurationPersister.java:143)
        at org.jboss.as.server@15.0.1.Final//org.jboss.as.server.ServerService.boot(ServerService.java:403)
        at org.jboss.as.controller@15.0.1.Final//org.jboss.as.controller.AbstractControllerService$1.run(AbstractControllerService.java:416)
        at java.base/java.lang.Thread.run(Thread.java:834)
Caused by: javax.xml.stream.XMLStreamException: Unknown keycloak-server subsystem tag: user

我希望有人可以为我阐明这一点,因为感觉就像我错过了一些明显的东西。提前致谢!

标签: javawildflykeycloak

解决方案


正如这里讨论的https://keycloak.discourse.group/t/how-to-configure-storageprovidertimeout/9171,目前没有配置此属性的可能性。

有一个未解决的问题可以解决这个问题:https ://issues.redhat.com/browse/KEYCLOAK-18856

作为一种临时快速而肮脏的解决方法,您可以在运行时通过反射在您的自定义 UserStorageProvier 实现中设置值:

public class CustomUserStorageProviderFactory implements UserStorageProviderFactory<CustomUserStorageProvider> {

@Override
public void onCreate(KeycloakSession session, RealmModel realm, ComponentModel model) {
    UserProvider userProvider = session.userStorageManager();

    try {
        Field field = userProvider.getClass().getSuperclass().getDeclaredField("STORAGE_PROVIDER_DEFAULT_TIMEOUT");
        field.setAccessible(true);
        Field modifiers = field.getClass().getDeclaredField("modifiers");
        modifiers.setAccessible(true);
        modifiers.setInt(field, field.getModifiers() & ~Modifier.FINAL);
        field.set(userProvider, 5000L);
    } catch (NoSuchFieldException | IllegalAccessException e) {
        throw new RuntimeException(e);
    }
}

}


推荐阅读