问题描述
我正在使用在Linux上运行的WildFly Core 10.0.3.Final之上的keycloak 8.0.1。我需要传递几个http代理值,以使keycloak服务器能够将路由计划程序用于传出的HTTP请求,例如:使用proxy01到达google,使用proxy02到达亚马逊。
我不能使用 jboss-cli ,因为我正在使用管道部署服务器-一切都应在自动模式下进行。
对于单个变量来说没有问题,您可以根据密钥库的文档https://www.keycloak.org/docs/latest/server_installation/#_proxymappings
将其传递给密钥库您有一个 jboss配置
<spi name="connectionsHttpClient">
<provider name="default" enabled="true">
<properties>
<property name="proxy-mappings" value="${env.HTTP_PROXY}"/>
</properties>
</provider>
</spi>
,并且您以HTTP_PROXY=hostnamePattern;proxyUri
模式使用了 env设置。
该模式用于密钥斗篷解析。
现在乘法代理值情况和问题。
如果您想让Wildfly传递数组,则应该这样写(从keycloak doc读取,它是正确的):
<spi name="connectionsHttpClient">
<provider name="default" enabled="true">
<properties>
<property
name="proxy-mappings"
value="[".*\\.(google|googleapis)\\.com;http://www-proxy.acme.com:8080",".*\\.acme\\.com;NO_PROXY",".*;http://fallback:8080"]"/>
</properties>
</provider>
</spi>
如您所见,您必须:
1-由于需要数组,因此请放在方括号[]
中,因为keycloak需要一个数组,它将用逗号将其拆分,然后将其视为String []
2-用双引号""
传递代理模式
3-和以引号引起来的双引号应更改为"
简化的结构看起来像这样(没有"
):[ "proxyPattern01","proxyPattern02" ]
问题是:
如果我将此舒适的构造放置到环境变量HTTP_PROXY
中并尝试将其捕获到密钥库中,我会看到此变量从wildfly传递到密钥库作为一条包含其自身的单行:方括号,双引号等。 Keycloak将其作为包含所有代理值的字符串来获取。
如果我手动或通过jboss-cli将这种构造应用于Wildfly的配置,则它会在keycloak中显示为一个包含两个元素的数组-每个元素仅包含一个代理模式,以后它将由keycloak正确解析和处理。
问题是:
如何将变量数组从环境传递给Wildfly,以便密钥斗篷可以将其视为包含多个元素的数组,而不是将所有变量聚合为带有方括号的单行的单个String?
添加#01
这种情况行之有效,但不合适,因为如果您想更改必须重新部署的代理服务器数量,而不仅仅是使用更改后的var重新启动服务器
<property
name="proxy-mappings"
value="["${env.AAA}","${env.BBB}","${env.CCC}"]"/>
和
AAA='.*\\.firstSite\\.ru;NO_PROXY'
BBB='.*\\.secondSite\\.ru;NO_PROXY'
CCC='.*;http://proxyForAll:8888'
添加#02
添加了很少的调试历史记录:
来自wildfly的行已在keycloak的行接受
String[] proxyMappings = config.getArray("proxy-mappings");
让我们看看什么是getArray(String key)方法:
JsonNode n = config.get(key); // key is "proxy-mappings"
让我们看看什么是config.get(key);
return _children.get(fieldName); // fieldName is "proxy-mappings"
让我们看看_children是什么
protected final Map<String,JsonNode> _children;
字符串是"proxy-mappings"
,JsonNode是来自wildfly的值。
如果我像这样手动输入wildfly的独立配置文件值,则此jsonNode值的类型为ArrayNode
:
value="[".*\\.(google|googleapis)\\.com;http://www-proxy.acme.com:8080",".*;http://fallback:8080"]"/>
,如果使用以下语法,则其类型为TextValue
:
value="${env.HTTP_PROXY}"/>
似乎JsonNode可以识别即将到来的值中的方括号,并在出现野蝇的情况下将其视为ArrayNode
value=" [ " value01 "," value02 "," value03 " ] "
,在使用wildfly的情况下将其视为TextNode
value="${env.HTTP_PROXY}"/>
最后一个来自调试的有趣信息:
有一个领域
private Config.Scope config;
类JsonConfigProvider
中类型为DefaultHttpClientFactory
的
在DefaultHttpClientFactory
初始化的瞬间,该字段引用了ObjectNode
,该字段具有自然的json值:
{
"enabled":true,"proxy-mappings":[
".*\\.one\\.ru;NO_PROXY",".*\\.two\\.ru;NO_PROXY",".*;http://three:8888"
]
}
它是一个变量数组,而不是其中包含数组的变量。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)