Skip to content

Permissions

权限可用于控制Node.js进程有权访问哪些系统资源,或者进程可以对这些资源执行哪些操作。权限还可以控制其他模块可以访问哪些模块。

  • 基于模块的权限控制在应用程序执行期间哪些文件或 URL 可供其他模块使用。例如,这可用于控制第三方依赖项可以访问哪些模块。
  • 基于进程的权限控制Node.js进程对资源的访问。可以完全允许或拒绝资源,也可以控制与其相关的操作。例如,在拒绝写入的同时,可以允许文件系统读取。

Features

当策略检查失败时,默认情况下Node.js将引发错误。可以通过在策略清单中定义“onerror”字段,将错误行为更改为几种可能性之一。以下值可用于更改行为:

  • "exit" :将立即退出进程。不允许运行任何清理代码
  • "log" :将在故障现场记录错误
  • "throw" :将在故障现场抛出 JS 错误。这是默认设置。
js
{
  "onerror": "log",
  "resources": {
    "./app/checked.js": {
      "integrity": "sha384-SggXRQHwCG8g+DktYYzxkXRIkTiEYWBHqev0xnpCxYlqMBufKZHAHQM3/boDaI/0"
    }
  }
}

允许加载文件 checked.js 的示例策略文件:

js
{
  "resources": {
    "./app/checked.js": {
      "integrity": "sha384-SggXRQHwCG8g+DktYYzxkXRIkTiEYWBHqev0xnpCxYlqMBufKZHAHQM3/boDaI/0"
    }
  }
}

基于进程的权限

Node.js权限模型是一种在执行过程中限制对特定资源的访问的机制。该 API 存在于一个标志后面,启用该标志 --experimental-permission 后,将限制对所有可用权限的访问。

--experimental-permission 可用权限由标志记录

当 启动 Node.js 时 --experimental-permission ,通过 fs 模块访问文件系统、生成进程、使用 node:worker_threads 、 本机插件和启用运行时检查器的能力将受到限制

js
$ node --experimental-permission index.js
node:internal/modules/cjs/loader:171
  const result = internalModuleStat(filename);
                 ^

Error: Access to this API has been restricted
    at stat (node:internal/modules/cjs/loader:171:18)
    at Module._findPath (node:internal/modules/cjs/loader:627:16)
    at resolveMainPath (node:internal/modules/run_main:19:25)
    at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:76:24)
    at node:internal/main/run_main_module:23:47 {
  code: 'ERR_ACCESS_DENIED',
  permission: 'FileSystemRead',
  resource: '/home/user/index.js'
}

允许访问生成进程和创建工作线程可以分别使用 --allow-child-process--allow-worker 来完成。

要在使用权限模型时允许本机插件,请使用 --allow-addons 标志

运行时 API

通过 --experimental-permission 标志启用权限模型时, process 会向对象添加一个新属性 permission 。此属性包含一个函数:

在运行时检查权限的 API 调用 ( permission.has()

js
process.permission.has('fs.write'); // true
process.permission.has('fs.write', '/home/rafaelgss/protected-folder'); // true

process.permission.has('fs.read'); // true
process.permission.has('fs.read', '/home/rafaelgss/protected-folder'); // false

文件系统权限

要允许访问文件系统,请使用 --allow-fs-read and --allow-fs-write 标志:

js
$ node --experimental-permission --allow-fs-read=* --allow-fs-write=* index.js
Hello world!
(node:19836) ExperimentalWarning: Permission is an experimental feature
(Use `node --trace-warnings ...` to show where the warning was created)

这两个标志的有效参数为:

  • * 分别允许所有 FileSystemReadFileSystemWrite 操作
  • 用逗号 ( , ) 分隔的路径,分别只允许匹配 FileSystemReadFileSystemWrite 操作

例:

  • --allow-fs-read=* - 它将允许所有 FileSystemRead 操作
  • --allow-fs-write=* - 它将允许所有 FileSystemWrite 操作
  • --allow-fs-write=/tmp/ - 它将允许 FileSystemWrite 访问该 /tmp/ 文件夹
  • --allow-fs-read=/tmp/ --allow-fs-read=/home/.gitignore - 它允许 FileSystemRead 访问 /tmp/ 文件夹和 /home/.gitignore 路径

还支持通配符:

  • --allow-fs-read=/home/test* 将允许对与通配符匹配的所有内容进行读取访问。例如: /home/test/file1/home/test2 传递通配符 ( * ) 后,所有后续字符都将被忽略。例如: /home/*.js 将工作类似于 /home/*

权限模型约束

在使用此系统之前,您需要了解一些限制:

  • 该模型不会继承到子节点进程或工作线程。

  • 使用权限模型时,以下功能将受到限制:

  • 无法使用 --no-warnings 标志

    • 本机模块
    • 子进程
    • 工作线程
    • 检查器协议
    • 文件系统访问
  • 设置Node.js环境后,将初始化权限模型。但是,某些标志(如 --env-file or --openssl-config )被设计为在环境初始化之前读取文件。因此,此类标志不受权限模型规则的约束。

  • 当 Permission 模型已启用,会影响内置的 cryptohttpstls 模块。

Released under the MIT License.