5.4 权限系统

权限系统是OpenCode的安全核心,通过精细的权限控制,可以确保AI助手在安全的边界内工作。

三种权限状态

每个工具都可以配置为以下三种权限状态之一:

状态说明使用场景
allow 自动执行,无需确认 信任的操作,如读取文件、搜索代码
ask 每次执行前询问用户确认 需要审查的操作,如执行命令、修改文件
deny 禁止执行 危险操作或不需要的功能
默认权限
默认情况下,读取类工具(read、grep、glob、list)为 allow,写入类工具(edit、write、bash)为 ask

配置结构

基本配置

opencode.json 中配置全局权限:

{
  "permission": {
    "read": "allow",
    "grep": "allow",
    "glob": "allow",
    "list": "allow",
    "edit": "ask",
    "write": "ask",
    "bash": "ask",
    "patch": "ask",
    "webfetch": "ask",
    "lsp": "allow"
  }
}

细粒度配置

可以为特定工具配置更详细的规则:

{
  "permission": {
    "bash": {
      "default": "ask",
      "rules": [
        {
          "pattern": "npm *",
          "permission": "allow"
        },
        {
          "pattern": "git *",
          "permission": "allow"
        },
        {
          "pattern": "rm -rf *",
          "permission": "deny"
        }
      ]
    }
  }
}

通配符匹配

权限规则支持通配符模式匹配:

通配符说明示例
*匹配任意字符(不含路径分隔符)*.js 匹配所有JS文件
**匹配任意路径src/**/*.ts 匹配src下所有TS文件
?匹配单个字符file?.txt 匹配file1.txt等
[abc]匹配括号内任一字符[Rr]eadme 匹配Readme或readme

路径规则示例

{
  "permission": {
    "edit": {
      "default": "ask",
      "rules": [
        {
          "pattern": "src/**/*.ts",
          "permission": "allow"
        },
        {
          "pattern": "test/**/*",
          "permission": "allow"
        },
        {
          "pattern": "*.config.js",
          "permission": "ask"
        },
        {
          "pattern": "node_modules/**/*",
          "permission": "deny"
        },
        {
          "pattern": ".env*",
          "permission": "deny"
        }
      ]
    }
  }
}

命令规则示例

{
  "permission": {
    "bash": {
      "default": "ask",
      "rules": [
        {
          "pattern": "npm run *",
          "permission": "allow"
        },
        {
          "pattern": "npm test",
          "permission": "allow"
        },
        {
          "pattern": "npm install *",
          "permission": "ask"
        },
        {
          "pattern": "git status",
          "permission": "allow"
        },
        {
          "pattern": "git diff *",
          "permission": "allow"
        },
        {
          "pattern": "git push *",
          "permission": "ask"
        },
        {
          "pattern": "rm *",
          "permission": "deny"
        },
        {
          "pattern": "sudo *",
          "permission": "deny"
        }
      ]
    }
  }
}

可用权限类型

以下是所有可配置权限的工具:

文件操作

工具说明建议权限
read读取文件内容allow
edit编辑现有文件ask
write创建或覆盖文件ask
patch应用补丁ask

搜索操作

工具说明建议权限
grep搜索文件内容allow
glob按模式查找文件allow
list列出目录内容allow

执行操作

工具说明建议权限
bash执行shell命令ask

扩展操作

工具说明建议权限
webfetch获取网页内容ask
lsp语言服务器查询allow
mcp:*MCP服务器工具ask

代理级别自定义

可以为不同代理配置不同的权限:

限制性代理

{
  "agent": {
    "reviewer": {
      "description": "代码审查代理",
      "mode": "primary",
      "permission": {
        "read": "allow",
        "grep": "allow",
        "glob": "allow",
        "list": "allow",
        "edit": "deny",
        "write": "deny",
        "bash": "deny"
      }
    }
  }
}

宽松代理

{
  "agent": {
    "developer": {
      "description": "开发代理",
      "mode": "primary",
      "permission": {
        "read": "allow",
        "grep": "allow",
        "glob": "allow",
        "list": "allow",
        "edit": "allow",
        "write": "allow",
        "bash": {
          "default": "allow",
          "rules": [
            {
              "pattern": "rm -rf *",
              "permission": "deny"
            },
            {
              "pattern": "sudo *",
              "permission": "deny"
            }
          ]
        }
      }
    }
  }
}

权限优先级

权限配置的优先级从高到低:

  1. 代理级别规则 - 特定代理的permission配置
  2. 细粒度规则 - 匹配的pattern规则
  3. 工具默认值 - 工具的default设置
  4. 全局默认值 - 系统默认权限

安全最佳实践

安全建议
  • 始终禁止 rm -rfsudo 命令
  • 保护敏感文件(.env、credentials等)
  • 对生产环境操作使用 ask 权限
  • 定期审查权限配置

推荐的安全配置

{
  "permission": {
    "read": "allow",
    "grep": "allow",
    "glob": "allow",
    "list": "allow",
    "edit": {
      "default": "ask",
      "rules": [
        { "pattern": ".env*", "permission": "deny" },
        { "pattern": "**/*.key", "permission": "deny" },
        { "pattern": "**/credentials*", "permission": "deny" },
        { "pattern": "src/**/*", "permission": "allow" },
        { "pattern": "test/**/*", "permission": "allow" }
      ]
    },
    "write": {
      "default": "ask",
      "rules": [
        { "pattern": ".env*", "permission": "deny" },
        { "pattern": "node_modules/**/*", "permission": "deny" }
      ]
    },
    "bash": {
      "default": "ask",
      "rules": [
        { "pattern": "npm test", "permission": "allow" },
        { "pattern": "npm run lint", "permission": "allow" },
        { "pattern": "git status", "permission": "allow" },
        { "pattern": "git diff", "permission": "allow" },
        { "pattern": "rm -rf *", "permission": "deny" },
        { "pattern": "sudo *", "permission": "deny" },
        { "pattern": "> /dev/*", "permission": "deny" }
      ]
    }
  }
}

运行时权限管理

在TUI界面中可以临时调整权限:

# 临时允许所有bash命令
/permission bash allow

# 恢复默认设置
/permission bash ask

# 查看当前权限状态
/permission
临时权限
通过命令修改的权限只在当前会话有效,重启后恢复配置文件设置。

下一步

高级配置部分完成。接下来学习OpenCode的扩展功能,包括LSP语言服务器集成。