GitHub Actions 怎样限制 GITHUB_TOKEN 的默认权限
GitHub Actions 的 GITHUB_TOKEN 默认权限不应该直接按“整个工作流都可写”来处理。更稳妥的做法是先把仓库级默认值调成受限模式,再在工作流或单个 job 中补上确实需要的权限。
官方地址:https://docs.github.com/en/actions/tutorials/authenticate-with-github_token
如果任务只需要读取代码,就给contents: read;只有创建 Issue、发布包或部署时,才在对应层级增加相应的write权限。GitHub 文档规定,只要在permissions中显式写出任一权限,未列出的权限就会被设为none。
先把仓库默认权限调成受限模式
先进入仓库的 Settings → Actions → General,找到 Workflow permissions。这里控制的是仓库层面的默认值:可以选择让令牌拥有更宽的读写权限,也可以选择只读的受限权限。新仓库或组织继承来的默认值可能不同,所以不要只凭记忆判断当前状态。

- 在仓库主页打开
Settings。 - 进入左侧
Actions → General。 - 在
Workflow permissions选择受限的只读选项,然后点击Save。
这一步只设置默认基线,不代表所有工作流都只能读取。工作流文件仍然可以用 permissions 明确声明所需范围;组织级设置更严格时,仓库页面可能无法改成更宽的权限。
再用 permissions 覆盖工作流范围
仓库默认值收窄后,把权限写进工作流文件。下面这个例子只让工作流读取代码,并让一个创建 Issue 的 job 获得写权限。YAML 中的注释说明了权限为何放在不同层级。
name: permission-demo
on: workflow_dispatch
# 工作流级权限是所有 job 的默认最小范围
permissions:
contents: read
jobs:
inspect:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: echo "只读取仓库内容"
create-issue:
runs-on: ubuntu-latest
# 这个 job 需要创建 Issue,所以只在这里追加写权限
permissions:
contents: read
issues: write
steps:
- name: Create issue
env:
# 令牌由 Actions 注入,示例不写入真实密钥值
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: gh issue create --title "自动记录" --body "由工作流创建"
工作流级 permissions 适合定义共同基线,job 级配置适合把写权限锁在单一任务中。write 已经包含读取能力;如果只声明 issues: write,未声明的其他权限会被设为 none,因此要根据任务是否还需要读取代码来补上 contents: read。

保存后怎样判断权限真的合适
先回到工作流文件,确认权限声明位置和缩进没有错误;再打开 Actions 页面查看工作流运行状态。只读任务应能完成 checkout 或读取 API,创建 Issue 的 job 才应使用 issues: write。不要用“整条工作流变绿”作为唯一判断,因为一个没有触发写操作的 job 可能暂时掩盖授权过宽或过窄。
如果出现 Resource not accessible by integration、API 返回 403 或某个动作提示没有写权限,按下面顺序处理:
- 确认仓库
Settings → Actions → General → Workflow permissions没有被组织级限制覆盖。 - 确认需要写入的能力写在正确的 workflow 或 job 层级,例如创建 Issue 对应
issues: write。 - 确认事件类型的边界。来自 fork 的
pull_request工作流通常不能随意获得写权限,不能靠 YAML 强行绕过平台限制。 - 重新保存工作流并查看新的运行记录,确认报错是否从权限不足变为其他具体问题。
常见误区与最终配置清单
最常见的误区有三个:把仓库默认权限当成最终权限、在工作流顶层给所有 job 开写权限、以及只写一个权限键却忘记未列出的权限会归零。对外发布或修改仓库的 job,应该单独列出它的写权限;只读 job 则保持 contents: read 或更小的范围。
| 检查位置 | 应看到的内容 | 目的 |
|---|---|---|
| 仓库设置 | Workflow permissions 为受限默认值 | 建立安全基线 |
| 工作流层 | 共同任务只声明 read | 减少全局授权 |
| job 层 | 写权限只出现在需要它的 job | 缩小爆炸半径 |
| 运行记录 | 权限不足时有明确 403 或 integration 提示 | 定位遗漏的权限键 |
把默认权限调低,再按 job 精确补权,通常比给整个工作流开启读写权限更容易维护。以后新增一个动作时,先问它需要访问哪类资源,再把对应权限写在最窄的作用域中。
相关问题
permissions 写在 workflow 还是 job?
所有 job 共用的只读基线写在 workflow;只有个别 job 需要写入时,优先放到该 job。
为什么写了 issues: write 仍然不能创建 Issue?
先确认工作流事件、仓库设置和组织策略没有进一步收窄令牌,再确认实际调用的是当前 job 的 GITHUB_TOKEN。
能不能直接使用 write-all?
可以表达宽权限,但它不符合最小授权目标。只有在明确知道所有 job 都需要写入多类资源时才应考虑,并且要记录理由。
GitHub Actions 环境保护规则怎样要求人工批准
- 上一篇
- GitHub Actions 环境保护规则怎样要求人工批准
- 下一篇
- GitHub Projects 怎样用自定义字段筛选迭代任务
-
- 文章 · 软件教程 | 42分钟前 | 字体缺失 Inkscape Object to Path 文字转路径 SVG交付
- Inkscape 怎样把文字转换为路径以避免字体缺失
- 473浏览 收藏
-
- 文章 · 软件教程 | 58分钟前 |
- JetBrains IDE 怎样查看方法的调用层级
- 275浏览 收藏
-
- 文章 · 软件教程 | 1小时前 | 开发环境 · docker · 代理 resources Docker Desktop Proxies
- Docker Desktop 怎样为开发环境配置代理
- 328浏览 收藏
-
- 文章 · 软件教程 | 1小时前 | Docker Compose 只读配置 configs
- Docker Compose configs 怎样把只读配置挂载到服务
- 135浏览 收藏
-
- 文章 · 软件教程 | 1小时前 | GitHub Projects custom fields Iteration
- GitHub Projects 怎样用自定义字段筛选迭代任务
- 357浏览 收藏
-
- 文章 · 软件教程 | 1小时前 |
- GitHub Actions 环境保护规则怎样要求人工批准
- 255浏览 收藏
-
- 文章 · 软件教程 | 1小时前 |
- VS Code Markdown 预览怎样显示本地图片
- 401浏览 收藏
-
- 文章 · 软件教程 | 1小时前 | 开发环境 · vs code · 软件教程 · VS Code 远程开发 vscode.dev Remote Tunnels VS Code Server
- VS Code Remote Tunnels 怎样让外部设备连接本地开发环境
- 186浏览 收藏
-
- 文章 · 软件教程 | 1小时前 |
- VS Code 调试配置怎样复用 workspaceFolder 变量
- 322浏览 收藏
-
- 文章 · 软件教程 | 1小时前 |
- VS Code tasks.json options.cwd 指定任务工作目录的配置方法
- 333浏览 收藏
-
- 文章 · 软件教程 | 1小时前 |
- VS Code 怎样把多根工作区保存为项目文件
- 170浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- PubMedQA
- 深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
- 763次使用
-
- H2O EvalGPT
- H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
- 759次使用
-
- LMArena
- LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
- 842次使用
-
- HELM
- 深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
- 811次使用
-
- MMBench
- MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
- 641次使用
-
- VS Code 怎么给 Go 项目配置测试任务:tasks.json 运行与结果验收
- 2026-07-09 501浏览
-
- Windows 11 如何开启 HEIF 图片支持
- 2026-05-31 501浏览
-
- TikTok用户画像与付费订阅变现方法
- 2026-05-27 501浏览
-
- 学信网学历翻译件申请方法
- 2026-05-27 501浏览
-
- Windows 11 24H2 更新失败0x80070005解决方法
- 2026-05-26 501浏览

