前端全栈之路Deno篇(三):一次性搞懂和学会用Deno 2.0 的权限系统详解和多种权限配置权限声明方式

简介: 本文深入解析了 Deno 2.0 的权限系统,涵盖主包和第三方包的权限控制机制,探讨了通过命令行参数、权限 API 和配置文件等多种权限授予方式,并提供了代码示例和运行指导,帮助开发者有效管理权限,提升应用安全性。

本文将详细介绍 Deno 2.0 的权限系统,重点对比主包和第三方包的权限控制机制,分析不同的权限授予方式,并通过代码和配置文件演示如何有效管理这些权限。

前文提要:Deno2.0与Bun对比,谁更胜一筹?,介绍参考 带你掌握Deno2.0的安装到项目构建全流程
本文主要介绍其权限系统、也是与其它js运行时不一样的部分

一、Deno 权限系统概述

Deno 的权限系统旨在通过限制代码对系统资源的访问,确保开发者能够清楚地控制应用的行为并减少安全风险。Deno 使用了“显式权限”模型,默认情况下,所有对文件系统、网络和环境变量等关键资源的访问都被禁止,开发者需要通过命令行参数或特定 API 明确授予这些权限。

Deno 的主要权限包括:

  • 文件系统访问 (--allow-read, --allow-write)
  • 网络访问 (--allow-net)
  • 环境变量访问 (--allow-env)
  • 运行子进程 (--allow-run)
  • 高精度时间访问 (--allow-hrtime)

二、主包和第三方包权限控制对比

Deno 在权限管理上对主包(开发者编写的代码)和第三方包采用了相同的安全模型。无论是主包还是第三方包,Deno 都要求开发者通过显式授权来启用权限。这和其他运行时(比如 Node.js)不一样,在 Deno 中每个模块和依赖包默认都没有权限。

资源类型 主包权限控制方式 第三方包权限控制方式 说明
文件系统访问 显式通过命令行参数 显式通过命令行参数 开发者需授予同样的文件系统访问权限
网络访问 显式通过命令行参数 显式通过命令行参数 无区别对待,需要显式授权
环境变量访问 显式通过命令行参数 显式通过命令行参数 权限统一,需授权
子进程访问 显式通过命令行参数 显式通过命令行参数 主包和第三方包无差别

示例代码:

// 读取文件,需授予 --allow-read 权限
const fileContent = await Deno.readTextFile("./example.txt");
console.log(fileContent);

// 发起网络请求,需授予 --allow-net 权限
const response = await fetch("https://example.com");
const data = await response.text();
console.log(data);

运行命令:

deno run --allow-read --allow-net app.ts

在上述示例中,如果没有正确授予文件读取和网络访问权限,Deno 会报错提示权限不足。

三、多种权限授予方式对比

Deno 允许通过多种方式授予权限,这为开发者提供了灵活性,尤其是在不同场景下可以使用合适的权限管理策略。

1. 命令行参数方式

这是最常见的方式,开发者在运行 Deno 程序时通过命令行参数显式授予权限,例如 --allow-read--allow-net 等。

优点:

  • 简单直观
  • 适合开发阶段快速调试

缺点:

  • 需要开发者记住并维护命令行权限
  • 对复杂应用来说管理不便

2. 权限 API

Deno 提供了权限管理的 API,允许开发者在代码中动态检查和请求权限。API 的主要方法包括:

  • Deno.permissions.query()
  • Deno.permissions.request()
  • Deno.permissions.revoke()

示例代码:

const status = await Deno.permissions.query({
    name: "read" });
if (status.state !== "granted") {
   
    console.log("请求文件读取权限");
    const requestStatus = await Deno.permissions.request({
    name: "read" });
    if (requestStatus.state === "granted") {
   
        console.log("权限已授予");
    }
}

优点:

  • 更加细致的权限控制
  • 适合生产环境下动态管理权限

缺点:

  • 增加代码复杂度
  • 可能影响性能

3. 权限配置文件

Deno 2.0 引入了权限配置文件的机制,允许开发者提前定义权限配置并在运行时加载。这种方式适合复杂应用的权限管理。

示例配置文件 deno.json

{
   
  "permissions": {
   
    "read": ["./data"],
    "net": ["example.com"],
    "run": true
  }
}

运行命令:

deno run --config deno.json app.ts

优点:

  • 适合生产环境和复杂项目
  • 权限集中管理,维护方便

缺点:

  • 增加了配置的复杂性
  • 不适合快速调试场景

权限授予方式对比总结

授予方式 优点 缺点 适用场景
命令行参数 简单直观,快速调试 维护不便,复杂应用不适合 开发、快速调试
权限 API 动态控制,精细粒度 增加代码复杂性,可能影响性能 生产环境动态授权
权限配置文件 权限集中管理,适合复杂项目 配置复杂,调试不便 复杂应用,生产环境

四、触发权限的代码与运行示例

以下简单示例展示如何在不同场景下触发 Deno 的权限机制。该示例包括文件读取、网络请求和运行子进程。

代码示例:

// 尝试读取文件
try {
   
  const fileContent = await Deno.readTextFile("./secret.txt");
  console.log(fileContent);
} catch (error) {
   
  console.error("读取文件失败:", error);
}

// 尝试发起网络请求
try {
   
  const response = await fetch("https://deno.land");
  const text = await response.text();
  console.log(text);
} catch (error) {
   
  console.error("网络请求失败:", error);
}

// 尝试运行子进程
try {
   
  const process = Deno.run({
    cmd: ["echo", "Hello from Deno!"] });
  await process.status();
} catch (error) {
   
  console.error("运行子进程失败:", error);
}

运行命令:

deno run --allow-read --allow-net --allow-run example.ts

通过这段代码,开发者可以观察到在未授予相应权限时,Deno 会抛出错误,提示缺少必要的权限。

五、总结

Deno 2.0 的权限系统是其安全架构的核心,通过默认的权限隔离和显式的权限授予机制,为前端全栈开发者提供了更高的安全性和灵活性。在不同场景下,开发者可以根据需求选择命令行参数、权限 API 或配置文件等不同方式来授予和管理权限。通过合理利用这些机制,可以确保应用的安全性和稳定性。

相关文章
|
2天前
|
JavaScript 前端开发 Docker
前端全栈之路Deno篇(二):几行代码打包后接近100M?别慌,带你掌握Deno2.0的安装到项目构建全流程、剖析构建物并了解其好处
在使用 Deno 构建项目时,生成的可执行文件体积较大,通常接近 100 MB,而 Node.js 构建的项目体积则要小得多。这是由于 Deno 包含了完整的 V8 引擎和运行时,使其能够在目标设备上独立运行,无需额外安装依赖。尽管体积较大,但 Deno 提供了更好的安全性和部署便利性。通过裁剪功能、使用压缩工具等方法,可以优化可执行文件的体积。
前端全栈之路Deno篇(二):几行代码打包后接近100M?别慌,带你掌握Deno2.0的安装到项目构建全流程、剖析构建物并了解其好处
|
1天前
|
JavaScript 前端开发 测试技术
前端全栈之路Deno篇(五):如何快速创建 WebSocket 服务端应用 + 客户端应用 - 可能是2025最佳的Websocket全栈实时应用框架
本文介绍了如何使用Deno 2.0快速构建WebSocket全栈应用,包括服务端和客户端的创建。通过一个简单的代码示例,展示了Deno在WebSocket实现中的便捷与强大,无需额外依赖,即可轻松搭建具备基本功能的WebSocket应用。Deno 2.0被认为是最佳的WebSocket全栈应用JS运行时,适合全栈开发者学习和使用。
|
2天前
|
前端开发 JavaScript 中间件
前端全栈之路Deno篇(四):Deno2.0如何快速创建http一个 restfulapi/静态文件托管应用及oak框架介绍
Deno 是由 Node.js 创始人 Ryan Dahl 开发的新一代 JavaScript 和 TypeScript 运行时,旨在解决 Node.js 的设计缺陷,具备更强的安全性和内置的 TypeScript 支持。本文介绍了如何使用 Deno 内置的 `Deno.serve` 快速创建 HTTP 服务,并详细讲解了 Oak 框架的安装和使用方法,包括中间件、路由和静态文件服务等功能。Deno 和 Oak 的结合使得创建 RESTful API 变得高效且简便,非常适合快速开发和部署现代 Web 应用程序。
|
2天前
|
JavaScript 前端开发 Serverless
前端全栈之路Deno篇:Deno2.0与Bun对比,谁更胜一筹?可能Deno目前更适合serverless业务
在前端全栈开发中,Deno 2.0 和 Bun 作为新兴的 JavaScript 运行时,各自展现了不同的优势。Deno 2.0 重视安全性和多平台兼容性,尤其是对 Windows 的良好支持和原生 TypeScript 支持;而 Bun 则以卓越的性能和简便的开发体验著称,适合快速迭代的小型项目。两者在不同场景下各具特色,Deno 更适合企业级应用和serverless,Bun 则适用于追求速度的项目。
|
2天前
|
前端开发 JavaScript API
前端的全栈之路Meteor篇(完):关于前后端分离及与各框架的对比,浅析分离之下的潜在耦合
本文探讨了Meteor.js这一全栈JavaScript框架的特点与优势,特别是在前后端分离架构中的应用。Meteor通过共享数据结构和简化全栈开发流程,实现了前后端的紧密协作。文章还对比了其他全栈框架,如Next.js、Nuxt.js等,分析了各自的优势与适用场景,最后讨论了通过定义文档归属者和用户专有数据集简化后端构建及端云数据同步的方法。
|
9天前
|
存储 人工智能 前端开发
前端大模型应用笔记(三):Vue3+Antdv+transformers+本地模型实现浏览器端侧增强搜索
本文介绍了一个纯前端实现的增强列表搜索应用,通过使用Transformer模型,实现了更智能的搜索功能,如使用“番茄”可以搜索到“西红柿”。项目基于Vue3和Ant Design Vue,使用了Xenova的bge-base-zh-v1.5模型。文章详细介绍了从环境搭建、数据准备到具体实现的全过程,并展示了实际效果和待改进点。
|
9天前
|
JavaScript 前端开发 程序员
前端学习笔记——node.js
前端学习笔记——node.js
24 0
|
9天前
|
人工智能 自然语言处理 运维
前端大模型应用笔记(一):两个指令反过来说大模型就理解不了啦?或许该让第三者插足啦 -通过引入中间LLM预处理用户输入以提高多任务处理能力
本文探讨了在多任务处理场景下,自然语言指令解析的困境及解决方案。通过增加一个LLM解析层,将复杂的指令拆解为多个明确的步骤,明确操作类型与对象识别,处理任务依赖关系,并将自然语言转化为具体的工具命令,从而提高指令解析的准确性和执行效率。
|
9天前
|
存储 弹性计算 算法
前端大模型应用笔记(四):如何在资源受限例如1核和1G内存的端侧或ECS上运行一个合适的向量存储库及如何优化
本文探讨了在资源受限的嵌入式设备(如1核处理器和1GB内存)上实现高效向量存储和检索的方法,旨在支持端侧大模型应用。文章分析了Annoy、HNSWLib、NMSLib、FLANN、VP-Trees和Lshbox等向量存储库的特点与适用场景,推荐Annoy作为多数情况下的首选方案,并提出了数据预处理、索引优化、查询优化等策略以提升性能。通过这些方法,即使在资源受限的环境中也能实现高效的向量检索。
|
9天前
|
机器学习/深度学习 弹性计算 自然语言处理
前端大模型应用笔记(二):最新llama3.2小参数版本1B的古董机测试 - 支持128K上下文,表现优异,和移动端更配
llama3.1支持128K上下文,6万字+输入,适用于多种场景。模型能力超出预期,但处理中文时需加中英翻译。测试显示,其英文支持较好,中文则需改进。llama3.2 1B参数量小,适合移动端和资源受限环境,可在阿里云2vCPU和4G ECS上运行。

热门文章

最新文章