java - 有没有办法在 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
我希望有人可以为我阐明这一点,因为感觉就像我错过了一些明显的东西。提前致谢!
解决方案
正如这里讨论的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);
}
}
}
推荐阅读
- python - 代码对黑客等级不起作用!在 Repl 和 Jupyter 上工作
- java - 将thymeleaf集成到spring boot项目中时Application Context不能为空
- c# - c#控制台程序中如何计算字符串的显示宽度?
- python - 使用 geopy 给出的原始地址数据解析字典
- laravel - 在laravel中满足某些条件后从db中删除行
- java - 作为字符串和整数的数字的字节数有什么区别?
- javascript - 如何使用 React 更改滑块拇指颜色
- angular - 在 Angular7 中使用 SVG foreignObject 标签
- sql-server - 如何获得每年第二至最高的月销售额
- css - 隐藏小部件的菜单