将数组作为环境变量传递到jboss的standalone.xml

问题描述

我正在使用在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="[&quot;.*\\.(google|googleapis)\\.com;http://www-proxy.acme.com:8080&quot;,&quot;.*\\.acme\\.com;NO_PROXY&quot;,&quot;.*;http://fallback:8080&quot;]"/>
        </properties>
    </provider>
</spi>

如您所见,您必须:

1-由于需要数组,因此请放在方括号[]中,因为keycloak需要一个数组,它将用逗号将其拆分,然后将其视为String []
2-用双引号""传递代理模式
3-和以引号引起来的双引号应更改为&quot;

简化的结构看起来像这样(没有&quot;):
[ "proxyPattern01","proxyPattern02" ]

问题是:
如果我将此舒适的构造放置到环境变量HTTP_PROXY中并尝试将其捕获到密钥库中,我会看到此变量从wildfly传递到密钥库作为一条包含其自身的单行:方括号,双引号等。 Keycloak将其作为包含所有代理值的字符串来获取
如果我手动或通过jboss-cli将这种构造应用于Wildfly的配置,则它会在keycloak中显示为一个包含两个元素的数组-每个元素仅包含一个代理模式,以后它将由keycloak正确解析和处理。

问题是:
如何将变量数组从环境传递给Wildfly,以便密钥斗篷可以将其视为包含多个元素的数组,而不是将所有变量聚合为带有方括号的单行的单个String?

添加#01
这种情况行之有效,但不合适,因为如果您想更改必须重新部署的代理服务器数量,而不仅仅是使用更改后的var重新启动服务器

<property 
  name="proxy-mappings" 
  value="[&quot;${env.AAA}&quot;,&quot;${env.BBB}&quot;,&quot;${env.CCC}&quot;]"/>

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="[&quot;.*\\.(google|googleapis)\\.com;http://www-proxy.acme.com:8080&quot;,&quot;.*;http://fallback:8080&quot;]"/>

,如果使用以下语法,则其类型为TextValue

value="${env.HTTP_PROXY}"/>

似乎JsonNode可以识别即将到来的值中的方括号,并在出现野蝇的情况下将其视为ArrayNode

value=" [ &quot; value01 &quot;,&quot; value02 &quot;,&quot; value03 &quot; ] "

,在使用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 (将#修改为@)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...