我们刚刚将Keycloak服务器从版本3升级到了版本6.0.1。 我们有一些自定义脚本,与Keycloak admin cli一起使用,用于测试LDAP用户存储连接。
然而,方法testLDAPConnection
在版本6.0.1中似乎不再起作用,因为它返回不允许的HTTP 405方法。
似乎testLDAPConnection
方法已更改,并且不接受GET请求,而仅接受POST请求。
Admin CLI documentation指出testLDAPConnection
方法仍可以按旧方式使用:
$ kcadm.sh get testLDAPConnection -q action=testConnection -q bindCredential=secret -q bindDn=uid=admin,ou=system -q connectionUrl=ldap://localhost:10389 -q useTruststoreSpi=ldapsOnly
这将失败,并显示HTTP 405。
我尝试如下使用 create 动词:
$ kcadm.sh create testLDAPConnection -s action=testConnection -s bindCredential=secret -s bindDn=uid=admin,ou=system -s connectionUrl=ldap://localhost:10389 -s useTruststoreSpi=ldapsOnly
我希望此操作返回HTTP 204代码,但会导致显示错误消息,提示“ LDAP测试错误” ,导致“ KC-SERVICES0054:未知操作:null” < / strong>。
该方法似乎可以实现,但参数发送不正确。
我在源代码中注意到,只有testLDAPConnection
方法具有FormParam参数类型,因此我的猜测是admin cli不知道如何设置这些参数。
我已经在Keycloak问题积压中搜索了此问题,但找不到任何东西。
有人遇到此问题或有任何解决办法的想法吗?
答案 0 :(得分:0)
在Keycloak v7中似乎也是一个问题,所以我决定创建一个脚本来解决此问题。
基本上,我请求一个令牌,然后使用该令牌调用 testLDAPConnection API。
这是脚本:
#!/bin/bash
KC_USERNAME=$1
KC_PASSWORD=$2
KC_SERVER=$3
KC_CLIENT_ID=$4
KC_CLIENT_SECRET=$5
REALM_NAME_IMPORT=$6
KC_CONTEXT=auth
CURL_OPTS="-k --noproxy $KC_SERVER"
# Request Token
KC_RESPONSE=$( \
curl $CURL_OPTS -X POST \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "username=$KC_USERNAME" \
-d "password=$KC_PASSWORD" \
-d 'grant_type=password' \
-d "client_id=$KC_CLIENT_ID" \
-d "client_secret=$KC_CLIENT_SECRET" \
"http://$KC_SERVER/$KC_CONTEXT/realms/master/protocol/openid-connect/token" \
| jq .
)
# Split token
KC_ACCESS_TOKEN=$(echo $KC_RESPONSE| jq -r .access_token)
# Verify if there is an acces token
if [ $KC_ACCESS_TOKEN ]; then
echo "Token acquired successfully"
exec 3>&1
# iterate through the hostnames csv file
while IFS="," read -r cluster hostname bindcredential; do
# Test if the given pair of LDAP host name and password is valid
KC_RESPONSE_LDAP_TEST=$( \
curl -w "%{http_code}" -o >(cat>&3) $CURL_OPTS \
-X POST \
-H "Content-Type: application/x-www-form-urlencoded" \
-H "Authorization: Bearer $KC_ACCESS_TOKEN" \
-d "action=testAuthentication&bindCredential=$bindcredential&bindDn=cn=root,o=test,c=ro&connectionTimeout=&connectionUrl=ldap://$hostname:389/&realm=$REALM_NAME_IMPORT&useTruststoreSpi=ldapsOnly" \
"http://$KC_SERVER/$KC_CONTEXT/admin/realms/$REALM_NAME_IMPORT/testLDAPConnection" \
| jq .
)
# if the response is valid(204) we continue do whatever we want to
if [ "$KC_RESPONSE_LDAP_TEST" == "204" ]; then
echo "Keycloak testAuthentication for configuration "$hostname" was successful."
else
echo "ERROR: Couldn't connect with "$hostname" or authentication failed (incorrect password)"
fi
done < ldaps.csv
else
echo "UNAUTHORIZED. No access token available"
fi
然后我从命令行运行脚本:
./testLDAPConnection.sh <username> <password> <keycloak_server> <client_id> <client_secret> <realm_to_operate>