临时解决 LDAP 导致 GitLab Members Blocked 问题

类似 GitLab 上 Members Blocked 状态如下图所示,(当然由于用户离职或者其他原因账户注销导致的 Blocked 不在本次谈论范围内)

这里要提一下背景,公司 GitLab 系统是统一使用 LDAP 邮箱认证,中间有一次邮箱的后缀归属更改,比如用户 zhangsan1 原账户邮箱为 [email protected],更改后账户邮箱为 [email protected],切换后,两个邮箱后缀的用户都可以正常使用 LDAP 认证,这就导致了上边问题的出现。zhangsan1 账户已经使用过 GitLab,其信息已经存储在 GitLab 数据库中,登录 Gitlab 时 LDAP 也是可以认证成功的,切换后,新的邮箱账户 [email protected] 登录以后, GitLab 又存储了一次该账户信息,但是不知道为什么新账户信息中用户名称变成了 zhangsan11 (莫非是 GitLab 查询数据库已存在 zhangsan1 账户,就会自动尾数追加 1 么?有待考证!),这就导致了与本地 git 账户不统一而 Clone 不了代码问题的出现。

好了,既然大概知道了原因,那么接下来就需要想办法解决掉这个问题。我们知道,GitLab 使用 PostgreSQL 数据库存储用户等相关数据,那么在不删除账户信息的原则上,尝试以下临时解决方案:

修改 PostgreSQL 数据库用户表 zhangsan1( [email protected]) 用户名为其他名称,然后登录 GitLab 在个人设置页更新 username,将 zhangsan11 修改为 zhangsan1,看是否可行。
修改 PostgreSQL 数据库用户表 zhangsan1( [email protected]) 用户名为其他名称,同时强制修改 zhangsan11( [email protected]) 用户名为 zhangsan1。
接下来,我们来验证一下方案一,是否可行。首先,登录 GitLab 所在服务器,查看 GitLab 服务(这里我是使用 Docker 启动的 GitLab 服务),并进入到容器内部。

# 查看 gitlab docker 容器服务  $ docker ps  CONTAINER ID        IMAGE                                                COMMAND             CREATED             STATUS                 PORTS                                                 NAMES  0a06dfd99823        <Domain_Name>/gitlab_ce/gitlab-ce:10.6.0-ce.0        "/assets/wrapper"   5 weeks ago         Up 5 weeks (healthy)   443/tcp, 0.0.0.0:2222->22/tcp, 0.0.0.0:8000->80/tcp   omnibus_gitlab    # 进入 gitlab 容器  $ docker exec -it 0a06dfd99823 /bin/bash  root@git:/#  

接下来,查看一下 GitLab 数据库 PostgreSQL 的配置文件,看下相关的配置信息,一般来说,GitLab 服务会专门创建一个系统用户来管理该数据库服务。

# 查看 postgresql database 配置文件  root@git:/# cat /var/opt/gitlab/gitlab-rails/etc/database.yml  # This file is managed by gitlab-ctl. Manual changes will be  # erased! To change the contents below, edit /etc/gitlab/gitlab.rb  # and run `sudo gitlab-ctl reconfigure`.    production:    adapter: postgresql    encoding: unicode    collation:    database: gitlabhq_production        # 数据库名称    pool: 10                             # 池子数    username: "gitlab"                   # 用户名    password:    host: "/var/opt/gitlab/postgresql"   # 主机地址    port: 5432                           # 端口号    socket:    sslmode:    sslrootcert:    sslca:    load_balancing: {"hosts":[]}    prepared_statements: false    statements_limit: 1000    fdw:  

我们可以看到 username: “gitlab,那么查看下容器内当前系统有哪些跟 gitlab 相关的用户。

# 查看 /etc/passwd 文件里边 gitlab 对应的系统用户  root@git:/# cat /etc/passwd | grep 'gitlab-'  gitlab-www:x:999:999::/var/opt/gitlab/nginx:/bin/false  gitlab-redis:x:997:997::/var/opt/gitlab/redis:/bin/false  gitlab-psql:x:996:996::/var/opt/gitlab/postgresql:/bin/sh  gitlab-prometheus:x:992:992::/var/opt/gitlab/prometheus:/bin/sh  gitlab-consul:x:991:991::/var/opt/gitlab/consul:/bin/sh  

可以看到 gitlab-psql 账户就是我们要使用的用户,接下来就切换到该用户,并连接到 gitlabhq_production 数据库。

# 切换到 gitlab-psql 用户登录  root@git:/# su - gitlab-psql    # 连接到 gitlabhq_production 库  $ psql -h /var/opt/gitlab/postgresql -d gitlabhq_production  psql (9.6.8)  Type "help" for help.    # 查看命令行帮助命令  gitlabhq_production=# h  Available help:    ABORT                            COMMENT                          DECLARE                          EXECUTE    ALTER AGGREGATE                  COMMIT                           DELETE                           EXPLAIN    ALTER COLLATION                  COMMIT PREPARED                  DISCARD                          FETCH    ALTER CONVERSION                 COPY                             DO                               GRANT    ALTER DATABASE                   CREATE ACCESS METHOD             DROP ACCESS METHOD               IMPORT FOREIGN SCHEMA    ALTER DEFAULT PRIVILEGES         CREATE AGGREGATE                 DROP AGGREGATE                   INSERT    ......    # l 列举所有的数据库列表,相当于 mysql 的 show databases  # 因为连接时指定了 -d gitlabhq_production,默认进去的就是 gitlabhq_production 数据库,不需要切换。  gitlabhq_production=# l                                           List of databases          Name         |    Owner    | Encoding | Collate |  Ctype  |        Access privileges  ---------------------+-------------+----------+---------+---------+---------------------------------   gitlabhq_production | gitlab      | UTF8     | C.UTF-8 | C.UTF-8 |   postgres            | gitlab-psql | UTF8     | C.UTF-8 | C.UTF-8 |   template0           | gitlab-psql | UTF8     | C.UTF-8 | C.UTF-8 | =c/"gitlab-psql"               +                       |             |          |         |         | "gitlab-psql"=CTc/"gitlab-psql"   template1           | gitlab-psql | UTF8     | C.UTF-8 | C.UTF-8 | "gitlab-psql"=CTc/"gitlab-psql"+                       |             |          |         |         | =c/"gitlab-psql"  (4 rows)    # 列举当前数据库所有表,相当于 mysql 的 show tables  gitlabhq_production=# dt                           List of relations   Schema |                   Name                   | Type  | Owner  --------+------------------------------------------+-------+--------   public | abuse_reports                            | table | gitlab   public | appearances                              | table | gitlab   public | application_settings                     | table | gitlab   public | audit_events                             | table | gitlab   public | award_emoji                              | table | gitlab   public | badges                                   | table | gitlab   public | boards                                   | table | gitlab   ......    # 查看单表结构,相当于 desc tblname, show columns from tbname  gitlabhq_production=# d users                                                        Table "public.users"                      Column                    |            Type             |                     Modifiers  ----------------------------------------------+-----------------------------+----------------------------------------------------   id                                           | integer                     | not null default nextval('users_id_seq'::regclass)   email                                        | character varying(510)      | not null default ''::character varying   encrypted_password                           | character varying(510)      | not null default ''::character varying   reset_password_token                         | character varying(510)      | default NULL::character varying   reset_password_sent_at                       | timestamp with time zone    |   remember_created_at                          | timestamp with time zone    |   sign_in_count                                | integer                     | default 0   current_sign_in_at                           | timestamp with time zone    |   last_sign_in_at                              | timestamp with time zone    |   current_sign_in_ip                           | character varying(510)      | default NULL::character varying   last_sign_in_ip                              | character varying(510)      | default NULL::character varying   created_at                                   | timestamp with time zone    |   updated_at                                   | timestamp with time zone    |   name                                         | character varying(510)      | default NULL::character varying   admin                                        | boolean                     | not null default false   ......    # 退出 psql  gitlabhq_production-# q  

这里详细的 PostgreSQL 操作命令就不在描述了,具体可以参考 PostgreSQL Docs 官网文档说明。这里着重看下 users 表,这里面存储的就是所有的用户信息,接下来,我们可以查看验证一下 zhangsan1 和 zhangsan11 用户信息。

# users 表查看用户信息  gitlabhq_production=# SELECT id,email,name,username FROM users WHERE username='zhangsan1';   id |          email       |   name   | username  ----+----------------------+----------+----------   92 | [email protected] | 张三 | zhangsan1  (1 row)    gitlabhq_production=# SELECT id,email,name,username FROM users WHERE username='zhangsan11';    id  |          email        |   name   | username  ------+-----------------------+----------+----------   2877 | [email protected] | 张三 | zhangsan11  (1 row)  

果然如我们所料,存在两个账户,接下来修改 zhangsan1 用户名为 zhangsan1222。

gitlabhq_production=# UPDATE users SET username = 'zhangsan1222' WHERE id = 92;  (1 row)  

修改完毕后,登录 GitLab 点击 “Setting” —> “User Settings” —> “Account” —> “Change username” —> Path 输入框修改用户名为 zhangsan1 —> 点击 “Update username” 执行更新操作。

不过很遗憾,修改失败,提示消息为 Username change failed – Username has already been taken,修改的用户名已存在。。。 上边我们不是已经在数据库将 zhangsan1 改成了 zhangsan1222 了吗?

初步怀疑可能是 GitLab 缓存时效性问题,不知重启是否可以解决 (有待考证)。不过线上 GitLab 正在运行,暂时还没法立刻重启,怕影响用户使用,那就只能尝试方案二啦,强制将 zhangsan11 用户名修改为 zhangsan1。

gitlabhq_production=# UPDATE users SET username = 'zhangsan1' WHERE id = 2877;  (1 row)  

修改完毕,用户退出并重新登录 GitLab,就会发现账户名称已经修改过来啦,本地 Clone 也是没有问题的,当然以上只是简单的临时处理下,直接去线上服务器修改数据库数据,该方式比较暴力,不太友好,建议大家如果修改 GitLab 数据库,可以提前备份数据库,然后在 database 配置中开启客户端连接 IP,用本地客户端工具连接,那样比较直观方便。

原文出处:csdn -> https://blog.csdn.net/aixiaoyang168/article/details/80254375

本站所发布的一切资源仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如果侵犯你的利益,请发送邮箱到 [email protected],我们会很快的为您处理。
超哥软件库 » 临时解决 LDAP 导致 GitLab Members Blocked 问题