从 Keycloak 的脚本映射器返回数组
Returning array from Keycloak's script mapper
我想编写 ScriptBasedOIDCProtocolMapper
脚本来处理我的角色声明的一些自定义逻辑。不幸的是,我无法 return 正确序列化数组。
即当脚本 return 跟随数组时:
["one", "two"]
声明值被序列化为地图:
...other claims...
claimName: { 0: "one", 1: "two" }
我期望 JSON 数组:
...other claims...
claimName: ["one", "two"]
我该怎么办?
我想避免提供自定义协议映射器,我有脚本映射器的其他用例,即处理 scope
和 aud
声明。
我加强了搜索,刚刚找到了问题的答案
How do I create a Java array from JavaScript?
在 Rhino 上 FAQ
You must use Java reflection. For instance, to create an array of java.lang.String of length five, do
var stringArray = java.lang.reflect.Array.newInstance(java.lang.String, 5)
;
Then if you wish to assign the string "hi" to the first element, simply execute
stringArray[0] = "hi"
;
然而,为了让它工作,我需要通过添加 .class
来稍微修改它以获得预期的类型定义:
java.lang.reflect.Array.newInstance(java.lang.String.class, 5);`
我想编写 ScriptBasedOIDCProtocolMapper
脚本来处理我的角色声明的一些自定义逻辑。不幸的是,我无法 return 正确序列化数组。
即当脚本 return 跟随数组时:
["one", "two"]
声明值被序列化为地图:
...other claims...
claimName: { 0: "one", 1: "two" }
我期望 JSON 数组:
...other claims...
claimName: ["one", "two"]
我该怎么办?
我想避免提供自定义协议映射器,我有脚本映射器的其他用例,即处理 scope
和 aud
声明。
我加强了搜索,刚刚找到了问题的答案
How do I create a Java array from JavaScript?
在 Rhino 上 FAQ
You must use Java reflection. For instance, to create an array of java.lang.String of length five, do
var stringArray = java.lang.reflect.Array.newInstance(java.lang.String, 5)
;Then if you wish to assign the string "hi" to the first element, simply execute
stringArray[0] = "hi"
;
然而,为了让它工作,我需要通过添加 .class
来稍微修改它以获得预期的类型定义:
java.lang.reflect.Array.newInstance(java.lang.String.class, 5);`