docker-compose部署Keycloak如何实现初始管理员邮箱自动配置
解决方案
你遇到的问题本质是Realm层级的SMTP配置已经生效,但管理员账户的邮箱字段为空,Keycloak发件时会校验关联账户的邮箱合法性,所以需要提前补全该字段,可通过以下两种方案实现启动自动配置:
方案1:修改Realm导出文件内置用户配置
你当前使用KEYCLOAK_IMPORT参数导入realm-export.json初始化Realm,只需在配置文件中补充管理员账户的邮箱信息即可:
- 打开你本地的
keycloak/realm-export.json文件,找到对应Realm配置下的users节点(如果不存在可以手动新建) - 加入admin用户的完整配置:
"users": [ { "username": "admin", "enabled": true, "email": "example@gmail.com", "emailVerified": true, "credentials": [ { "type": "password", "value": "password", "temporary": false } ], "realmRoles": ["admin"], "clientRoles": { "realm-management": ["realm-admin"] } } ]
注意:如果你的管理员账户归属默认的master Realm,需要同时导出master Realm的配置并加入上述配置,启动时同步导入即可。
方案2:新增初始化容器调用Admin API自动配置
如果不想修改导出的JSON文件,可以在docker-compose中新增一个轻量初始化服务,等Keycloak启动完成后自动调用官方API补全邮箱:
修改你的docker-compose.yml,在services节点下新增如下配置:
init-keycloak: image: curlimages/curl:7.85.0 depends_on: - keycloak entrypoint: | sh -c ' # 等待Keycloak服务完全启动 until curl -s http://keycloak:8180/auth/realms/master > /dev/null; do sleep 3; done # 申请管理员访问令牌 TOKEN=$(curl -s -X POST http://keycloak:8180/auth/realms/master/protocol/openid-connect/token \ -H "Content-Type: application/x-www-form-urlencoded" \ -d "username=admin" \ -d "password=password" \ -d "grant_type=password" \ -d "client_id=admin-cli" | grep -o '"'"'access_token":"[^"]*'"'"' | cut -d'"'"' -f4) # 查询admin用户的ID USER_ID=$(curl -s -H "Authorization: Bearer $TOKEN" \ http://keycloak:8180/auth/admin/realms/master/users?username=admin | grep -o '"'"'id":"[^"]*'"'"' | cut -d'"'"' -f4) # 更新用户邮箱信息 curl -s -X PUT http://keycloak:8180/auth/admin/realms/master/users/$USER_ID \ -H "Authorization: Bearer $TOKEN" \ -H "Content-Type: application/json" \ -d "{\"email\":\"example@gmail.com\",\"emailVerified\":true}" echo "管理员邮箱配置完成" '
注意:如果你的管理员归属自定义Realm,将上述配置中所有路径的master替换为你的自定义Realm名称即可。
两种方案任选其一即可,重启服务后无需手动登录后台配置,邮箱验证功能可直接使用。
内容的提问来源于stack exchange,提问作者msts1906
相关产品推荐
相关产品推荐

