修复 Crowd 无法登录的问题

最近将大部分的服务都 Docker 化了,遂打算把 Crowd 也给 Docker 化了。不知道 Crowd 的同学可以去官网看一下介绍,简单说,就是一个单点登录和集中身份验证的东东。因为要使用 Stash,Jira 和 Confluence 等 Atlassian 的产品,所以用个 Crowd 可以偷懒,不用每个系统设置账户。

成也 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" for help.

postgres=#

切换到 Crowd 数据库,名字可能不同,请根据实际情况修改

1
2
postgres=# \c crowd
You are now connected to database "crowd" as user "postgres".

查看一下现有的 IP 允许情况

1
2
3
4
5
6
7
8
9
10
rowd=# SELECT * FROM cwd_application_address;
application_id | remote_address
----------------+-----------------
2 | crowd.zhimou.io
2 | 3743b52a0e96
2 | 172.17.0.22
2 | 172.16.10.200
2 | 127.0.0.1
2 | localhost
(6 rows)

果然,没有发现被禁止的 172.17.0.24 这个 IP,把它添加进去

1
2
crowd=# INSERT INTO cwd_application_address VALUES (2, '172.17.0.24');
INSERT 0 1

再查看一下 table

1
2
3
4
5
6
7
8
9
10
11
crowd=# SELECT * FROM cwd_application_address;
application_id | remote_address
----------------+-----------------
2 | crowd.zhimou.io
2 | 3743b52a0e96
2 | 172.17.0.22
2 | 172.16.10.200
2 | 127.0.0.1
2 | localhost
2 | 172.17.0.24
(7 rows)

Good,有了,再访问一下网页看看

欧耶,好了。

参考资料: