Deno 的权限系统提供了一个安全模型,通过显式的权限授予来控制对系统资源的访问。本文档涵盖了核心权限类型、状态管理、描述符解析、用户提示机制以及与运行时操作的集成。有关 CLI 标志解析和权限配置的信息,请参阅 命令处理。
Deno 的权限系统基于显式同意的原则运作,对系统资源的访问需要通过 CLI 标志预先授予权限,或通过交互式提示获得用户同意。该系统支持文件系统访问、网络操作、环境变量、系统信息、子进程执行和外部函数接口 (FFI) 操作的细粒度权限。
来源:runtime/permissions/lib.rs674-1663 runtime/permissions/lib.rs83-93
权限系统使用四状态模型来表示权限状态。每种权限类型都实现了 QueryDescriptor trait,从而能够对不同资源类型进行统一的权限检查。
PermissionState 枚举定义了四种不同的状态
Granted:对请求资源的完全访问权限GrantedPartial:已授予访问权限,但通过 deny 标志拒绝了部分权限Prompt:需要用户同意(默认状态)Denied:明确拒绝访问来源:runtime/permissions/lib.rs83-93 runtime/permissions/lib.rs161-216
来源:runtime/permissions/lib.rs331-357 runtime/permissions/lib.rs694-753 runtime/permissions/lib.rs924-993
UnaryPermission<TQuery> 结构是管理特定类型权限的核心容器,它在全局和细粒度级别上维护已授予权限和已拒绝权限的单独列表。
来源:runtime/permissions/lib.rs367-672 runtime/permissions/lib.rs458-490
权限检查过程遵循分层评估
Prompt来源:runtime/permissions/lib.rs458-490 runtime/permissions/lib.rs551-589
RuntimePermissionDescriptorParser 负责将基于字符串的权限规范转换为类型化描述符,并进行验证和路径解析。
来源:runtime/permissions.rs24-174 runtime/permissions.rs45-64
网络权限支持各种格式,包括 IPv4/IPv6 地址、带可选端口的域名以及子域通配符
来源:runtime/permissions/lib.rs924-1147 runtime/permissions/lib.rs830-921
当代码尝试在未事先获得授权的情况下访问受保护资源时,提示系统会提供交互式权限请求。
来源:runtime/permissions/prompter.rs59-76 runtime/permissions/lib.rs161-216 runtime/permissions/prompter.rs312-506 runtime/permissions/prompter.rs121-283
TtyPrompter 实现了多项安全措施,以防止绕过权限提示
来源:runtime/permissions/prompter.rs312-506 runtime/permissions/prompter.rs121-283
权限系统通过 PermissionsContainer 和用于权限查询、请求和撤销的专用操作与 Deno 的操作层集成。
来源:runtime/ops/permissions.rs67-125 runtime/ops/permissions.rs19-46
Worker 线程会继承其父上下文的权限,并可通过 ChildPermissionsArg 进行可选修改
来源: runtime/permissions/lib.rs627-671 runtime/ops/worker_host.rs172-181 ext/node/polyfills/worker_threads.ts117-181