离职人员Composer私有仓库权限回收需同步注销服务端账号、清理HTTP Basic凭证、Git SSH密钥、长期API Token,并清除客户端auth.json及CI中个人凭证,最后通过干净环境验证断连。

离职人员的 Composer 私有仓库权限不是“删掉账号”就完事——真正要收的是 HTTP Basic 凭证、Git SSH 密钥、Satis/Artifactory 的用户绑定,以及所有可能绕过账号体系的长期有效 Token。漏掉任意一项,私有包就能继续被拉取、构建、甚至篡改。
私有仓库服务端账号与凭证必须同步注销
离职流程启动时,不能等最后一天才操作。Satis、Artifactory、Nexus 等服务端的用户账户需立即禁用,而非仅删除;重点清理以下三类凭据:
-
HTTP Basic用户名/密码(常用于COMPOSER_AUTH配置)——在 Artifactory 中对应 “Users” 页面的 active 状态,禁用后需确认composer update返回401 Unauthorized而非静默 fallback - Git SSH 密钥(若私有包通过
"type": "vcs"引用)——检查 Git 服务器(如 GitLab/GitHub Enterprise)中该用户是否还保有 deploy keys 或个人 SSH key,批量移除并验证git ls-remote git@xxx:vendor/package.git失败 - 长期有效的 API Token 或 Access Key(例如 Satis 构建脚本里硬编码的
ARTIFACTORY_TOKEN)——这类凭证往往独立于用户生命周期,必须从 CI 配置、部署脚本、.env 文件中彻底清除,不能只靠“用户注销”自动失效
客户端配置残留是最大盲区
开发人员本地 ~/.composer/auth.json 或项目级 auth.json 文件中,很可能存着私有源的认证信息。这些文件不会随账号注销自动消失,且 Composer 默认优先读取它们:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 检查
composer config --global --list | grep http-basic,确认全局配置中已无残留条目;若有,运行composer config --global --unset http-basic.example.com - 排查项目根目录是否存在未提交的
auth.json(尤其在 CI 流水线中被误 commit 的情况),直接删除并git rm --cached auth.json - CI 环境中禁止复用开发者个人凭证——所有
COMPOSER_AUTH必须由统一密钥管理服务(如 HashiCorp Vault)注入,且生命周期绑定 job 而非 person
别忽略共享账号和自动化凭证
团队共用的 ci-bot、deploy-user 这类账号,常被赋予高权限但无人认领。离职人员若曾是该账号的唯一管理员或知晓者,其权限回收就变成“回收知情权”:
- 检查 Satis 构建机、Artifactory 上传脚本、CI 的 deploy user 是否使用了该员工的个人 Token 或 SSH key,全部替换为服务账号
- 查看私有仓库的 audit log:谁 last pushed tag?谁 last triggered Satis build?谁 last 修改了 virtual repo 的 upstream 配置?这些操作记录比账号状态更真实
- 共享账号必须启用 MFA,且至少两名在职成员能重置凭证;任何“只有 A 知道密码”的状态,都等于没回收
回收后必须验证是否真断连
权限回收完成不等于风险解除。要确认私有包确实无法再被拉取,最直接的方式是模拟一个干净环境:
- 在全新 Docker 容器中执行:
docker run --rm -v $(pwd):/app -w /app php:8.2-cli composer clear-cache && composer update --no-cache --dry-run - 观察输出中的
source行:如果仍显示https://packages.your-company.com并尝试 fetch,说明服务端凭证未生效或客户端缓存未清;若 fallback 到packagist.org或报401/403,才算成功阻断 - 特别注意
composer show -p vendor/private-package的输出——它会暴露实际来源,避免“以为切到私有源,其实走的是镜像站缓存”
最易被忽略的是:离职人员可能早已把私有包 fork 到个人 GitHub,并用 "type": "vcs" 直接引用自己的仓库。这种情况下,服务端权限回收完全无效。必须定期扫描项目中所有 repositories 配置,识别非企业域名的 Git 地址,并建立白名单机制。

















