成也 Docker,败也 Docker,正是因为使用了 Docker 结果导致无法登录 Crowd 了。因为 Crowd 是使用 Application 跟 IP 两种方式认证的,而 Docker 重启实例后 IP 就会变化,同时我又使用了 Nginx 做反向代理,结果就无法正常认证了。
网页登录的时候,显示如下类似界面,刚开始以为是用户名密码错误,最后才发现,是 IP 地址的问题。
在 Docker 中查看 Log 信息如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
Caused by: org.codehaus.xfire.fault.XFireFault: Client with address "172.17.0.24" is forbidden from making requests to the application, crowd. at org.codehaus.xfire.fault.Soap11FaultSerializer.readMessage(Soap11FaultSerializer.java:31) at org.codehaus.xfire.fault.SoapFaultSerializer.readMessage(SoapFaultSerializer.java:28) at org.codehaus.xfire.soap.handler.ReadHeadersHandler.checkForFault(ReadHeadersHandler.java:111) at org.codehaus.xfire.soap.handler.ReadHeadersHandler.invoke(ReadHeadersHandler.java:67) at org.codehaus.xfire.handler.HandlerPipeline.invoke(HandlerPipeline.java:131) at org.codehaus.xfire.client.Client.onReceive(Client.java:406) at org.codehaus.xfire.transport.http.HttpChannel.sendViaClient(HttpChannel.java:139) at org.codehaus.xfire.transport.http.HttpChannel.send(HttpChannel.java:48) at org.codehaus.xfire.handler.OutMessageSender.invoke(OutMessageSender.java:26) at org.codehaus.xfire.handler.HandlerPipeline.invoke(HandlerPipeline.java:131) at org.codehaus.xfire.client.Invocation.invoke(Invocation.java:79) at org.codehaus.xfire.client.Invocation.invoke(Invocation.java:114) at org.codehaus.xfire.client.Client.invoke(Client.java:336) at org.codehaus.xfire.client.XFireProxy.handleRequest(XFireProxy.java:77) at org.codehaus.xfire.client.XFireProxy.invoke(XFireProxy.java:57) at com.sun.proxy.$Proxy379.authenticateApplication(Unknown Source) at com.atlassian.crowd.service.soap.client.SecurityServerClientImpl.authenticate(SecurityServerClientImpl.java:235) ... 97 more
第一行就暴露了,IP 172.17.0.24 被禁止,而这个 IP 正是 Nginx 的 Docker 实例,找到问题的根本点,那么就好解决了。登录到 PostgreSQL 的实例中,添加 IP 到数据库便可。
先进入 PostgreSQL 的实例:
1
# docker exec -ti postgres bash
然后切换到数据库账号身份
1 2
# su - postgres No directory, logging in with HOME=/
开启 PostgreSQL 客户端
1 2 3 4 5
$ psql psql (9.4.1) Type "help"forhelp.
postgres=#
切换到 Crowd 数据库,名字可能不同,请根据实际情况修改
1 2
postgres=# \c crowd You are now connected to database "crowd" as user "postgres".