📦 第06章 · 用户/组/权限

users/groups/projects 权限

用户/组/权限

这一章讲 GitLab 的权限体系:用户(User)、组(Group)、项目(Project)三层,以及"谁能做什么"的各种角色(Role/Member 权限)。理解这套,才能安全地多人协作,既放开访问又守住仓库。

三层结构

用户(User)  ── 加入 ──>  组(Group)  ── 包含 ──> 项目(Project)
                           │                      │
                     组级权限(对人)          项目级权限(对人/组)
  • 用户:一个人一个账号,可发 SSH key / 2FA。
  • 组:把多个用户聚起来,统一给组赋权,成员自动继承。
  • 项目:实际存放代码的地方,可设公开/私有,单独控制权限。

原则:能组级授权就别逐项授权,方便管理和回收。

角色(Member 权限)一览

角色 权限层级(从低到高)
Guest 只读、只能看 public 项目
Reporter Guest + 可以看代码、拉 issue、看 CI/CD 状态
Developer Reporter + 可以提交代码( push )、建分支、打 tag、运行 CI
Maintainer Developer + 可以建项目、保护分支、管理 MR、管理仓库设置
Owner 全部权限,可删除项目/组、改成员、转移

用命令行(cli)管理成员(也可网页操作)

GitLab 一般用 Web 界面,但 CLI/脚本也能管理:

# 添加成员到项目(developer 角色)
gitlab-rails runner "p = Project.find_by(path: 'myrepo'); p.add_member(User.find_by(username:'alice'), Gitlab::Access::DEVELOPER)" 

# 或用 gitlab api(personal_access_token)
curl --header "PRIVATE-TOKEN: <token>" \
     "https://gitlab.bangdream.xyz/api/v4/projects/<pid>/members" \
     -d "user_id=<uid>&access_level=30"   # 30=Developer

提示 | access_level 数值:10 Guest、20 Reporter、30 Developer、40 Maintainer、50 Owner。网页操作时选择角色即可,无需记数字。

项目可见性与权限

可见性 谁能看
Private 仅明确加入的成员
Internal 已登录的该 GitLab 用户可见
Public 任何人可见,但写还需要权限

保护分支(Protected Branches)

线上主分支(如 main)建议"保护",避免直接 push,必须走 Merge Request 且可能要求 Code Review:

  • 网页:项目 → Settings → Repository → Protected branches。
  • 常见设置:main 只允许 Maintainer 推送;对 Developer 关闭直接 push。
  • 效果:开发要改主分支,先建分支 → push → 提 MR → 被审 → 合并。

实战经验 | 生产分支一律保护;持续集成在 protected 分支上触发。这能有效防止"随手覆盖 main"。

用户来源:本地 / LDAP / OAuth

  • 本地注册:默认网页可注册(生产可关掉,设 signup_enabled=false,避免陌生人注册)。
  • LDAP/AD:企业内用统一账号。
  • OAuth:dsh.bangdream.xyz 用的 GitHub OAuth 认证就是这种思路。

管理用户与操作的常见坑

坑 说明 解决
陌生账号能注册进来 默认 signup 开了 关掉或加邮箱验证、域名白名单
权限给太大 给了 Maintainer 却只想让别人只读 用最小权限;能 Guest 就别 Reporter
有人能删仓库 Owner 才有删除权限 别给普通成员 Owner
SSH key 不生效 用户未添加 key 用户在设置里加 key;服务端确认 ~/.ssh/authorized_keys
忘了某个人的权限 成员散落 用"组"统一管理,定期看 Members 列表

安全建议

  1. 最小权限:给到刚好够用的角色即可,别养成"都是 Maintainer"。
  2. 强制 2FA(可选):gitlab_rails['two_factor_grace_period'] 等,生产建议开。
  3. 保护生产分支 + 要求 Code Review。
  4. 定时清理离职/陌生成员与无用的个人访问令牌。

相关命令

  • API 查权限:curl ... /projects/<pid>/members
  • 看用户:gitlab-rails runner "User.all.each { |u| puts u.username }"
  • 网页:项目/组 → Members 管理角色;Settings → Repository 管分支保护。