🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

登录门禁 Haste123/dsh-plugin-login

DeepSeek Harness
Haste12356 天前有提交已提供中文文档扫描:含敏感能力

未登录时全屏遮罩,校验通过后才放行访问页面

30/100
综合分
1
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/9/16 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

该插件未发布到 npm,按作者文档从 GitHub 源安装即可(静态检查只覆盖 npm 路径,不代表插件不可用)。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add Haste123/dsh-plugin-login
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:需留意
是什么
dsh 原生插件 · security
装得上吗
实装验证未通过(runtime_never_loaded),装前请到仓库确认最近更新与 issue
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 56 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
⚠︎ 实装验证未通过(runtime_never_loaded · 2026/11/3) ——可能是验证环境差异,装前建议到 GitHub 仓库确认最近更新与 issue。
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查需源码安装

仓库 package.json 标记 private,未发布到 npm,需从源码安装

展开查看检查明细 ↓

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

✗npm 包dsh-plugin-login(未发布到 npm,仅可源码安装)
✓Node 引擎未声明 engines.node
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

源码安装时若 pnpm 拦截 prepare 脚本,按其提示在 pnpm-workspace.yaml 的 allowBuilds 中放行后重跑。

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/7 16:40:52

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

可执行外部命令读写/删除本地文件
查看扫描证据(共 15 处,展示前 11 条)
  • 读取本地文件
    build.mjs:52
    const pkg = JSON.parse(readFileSync(join(rootDir, 'package.json'), 'utf8'));
  • 读取本地文件
    build.mjs:53
    const src = readFileSync(join(rootDir, 'src/client.js'), 'utf8');
  • 写入本地文件
    build.mjs:72
    writeFileSync(join(rootDir, 'client.js'), bundle, 'utf8');
  • 读取本地文件
    build.mjs:87
    const names = existsSync(profilesDir)
  • 读取本地文件
    build.mjs:88
    ? readdirSync(profilesDir, { withFileTypes: true }).filter((e) => e.isDirectory()).map((e) => e.name)
  • 读取本地文件
    build.mjs:110
    if (existsSync(join(installedRoot, 'package.json'))) {
  • 执行外部命令来自配置/变量
    build.mjs:115
    const result = spawnSync(addCommand, { cwd: profileDir, shell: true, stdio: 'inherit' });
  • 读取本地文件
    build.mjs:132
    if (existsSync(patchFile)) {
  • 写入本地文件
    build.mjs:142
    if (!fileExisted) mkdirSync(profileDir, { recursive: true });
  • 写入本地文件
    build.mjs:143
    writeFileSync(patchFile, textWithBlock, 'utf8');
  • 写入本地文件
    build.mjs:155
    writeFileSync(target, sourceBytes);
扫描于 2026/11/4(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 未登录全屏遮罩
  • 校验通过放行
  • 配色跟随系统

DSH Web 登录门禁插件:未登录时全屏遮罩,Linear 风格登录页,配色跟随系统明暗,零滚动单页

README

由 DeepSeek 最新模型翻译生成
dsh-plugin-login DSH(DeepSeek Harness)Web 端的登录门禁插件:启用后,整个页面被全屏登录界面遮挡,未登录不能访问/操作页面;输入默认账号 haste / 密码 haste123456 校验通过后放行。 - 配色随系统明暗主题自动切换(prefers-color-scheme;视觉设计参考 awesome-design-md 的 Linear 设计语言:近黑画布 / 炭色面板 / 发丝线分隔 / 单一薰衣草紫点缀) - 单页零滚动(覆盖层 overflow:hidden + 阻断滚动链 + 登录期间锁定 html/body) - 页面上不展示任何账号密码提示 - 纯前端校验,不调用后端接口(接入真实后端时只改一处逻辑,见下文「安全说明」) 目录结构 dsh-plugin-login/
展开完整文档(README 剩余 1 节)
dsh-plugin-login

DSH(DeepSeek Harness)Web 端的登录门禁插件:启用后,整个页面被全屏登录界面遮挡,未登录不能访问/操作页面;输入默认账号 haste / 密码 haste123456 校验通过后放行。

- 配色随系统明暗主题自动切换(prefers-color-scheme;视觉设计参考 awesome-design-md 的 Linear 设计语言:近黑画布 / 炭色面板 / 发丝线分隔 / 单一薰衣草紫点缀)
- 单页零滚动(覆盖层 overflow:hidden + 阻断滚动链 + 登录期间锁定 html/body)
- 页面上不展示任何账号密码提示
- 纯前端校验,不调用后端接口(接入真实后端时只改一处逻辑,见下文「安全说明」)

目录结构

dsh-plugin-login/
├── package.json # 包元数据:dsh.client 声明、exports["./client"]、构建脚本 ├── index.js # Node 半边(host face):空 apply,仅让包成为 Loader 条目 ├── client.js # 浏览器半边 bundle(构建产物,供 DSH 模块系统加载) ├── build.mjs # 打包 + 自动注册 + 同步脚本(node build.mjs) ├── src/ │ └── client.js # 浏览器半边源码(真正的插件逻辑:登录界面 + 校验) └── README.md

工作原理(为什么是「一面 Node、一面浏览器」)

DSH 的客户端插件采用 dual-face(双面)npm 包模型:

1. Node 半边(index.js,package.json.main)在 DSH 的 Cordis 组合里以普通插件行挂载。它的 apply 是空的——它唯一的作用是让这个包成为一条 Loader 条目。
2. DSH 的 dsh-client-modules(Node 半边)扫描所有 Loader 条目,读取包 package.json 的:

"dsh": {
"client": {
"platform": "web" // 必填:声明这是一个 web 客户端插件的包 // "inject": [...], // 可选:浏览器模块依赖的包名(本插件只 require("react"),无需) // "external": [...], // 可选:静态表模块名(本插件无) } }

3. 扫描器再读取 exports["./client"] 指向的 bundle 文件(本插件是 ./client.js),把内容组合进 window.__DSH_BOOT__ 的 entry 图,浏览器加载后把 client.js 导出的 { inject, apply } 当作一个 Cordis 插件挂到客户端组合里。

bundle 必须是模块系统认识的格式(与官方包 @deepseek-ai/dsh-client-ui-cordis 的产物同构):

window.__ModuleLoader__.load({
id: "dsh-plugin-login", // 必须等于 package.json 的 name(= 模块条目 id)
factory: (require) => {
var React = require("react"); // Shell 种子模块,无需任何安装 // ……插件源码……
exports.inject = ['slots', 'timer'];
exports.apply = apply;
return module.exports;
}
});

本插件只依赖 Shell 已提供的 react、slots、timer 三个运行时设施,不需要任何 npm 安装、不需要在 dsh.client.inject/external 里声明别的包。

打包 / 注册(一条命令全自动)

零依赖:不需要 npm install,不需要 TypeScript/Vite。

node build.mjs # 默认凭据 haste / haste123456
node build.mjs admin admin@2024 # 自定义默认账号/密码(编译进 client.js)
node build.mjs admin # 只给账号,密码用默认值 haste123456
node build.mjs --no-register # 只打包,不碰 DSH 配置

build.mjs 默认做四件事(全部幂等,重复执行安全):

1. 打包:src/client.js → client.js(约 19 KB,未压缩),id 取自 package.json.name;账号/密码参数以 var AUTH_USER / AUTH_PASS 注入 bundle(JSON.stringify 转义,支持任意特殊字符),客户端用 typeof 兜底读取、未注入时回退内置默认值;
2. 安装:若插件还没被安装进 DSH web profile,自动执行 pnpm add file:(装过则跳过;失败会打印手工命令并返回非零退出码);
3. 注册:把插件行幂等写入 profile 的 cordis.patch.yml(自动找到 $DSH_HOME/profiles/web;DSH_PROFILE= 可指定别的 profile;已有该行时跳过);
4. 同步:把新 client.js / index.js 同步到 profile 的 node_modules 副本(字节一致则跳过,避免“改了源码忘了同步已安装副本”)。

环境变量:DSH_HOME(默认 ~/.dsh)、DSH_PROFILE(默认优先 web,只有一个 profile 时自动选用)。
⚠️ 改包名后必须重新 build:模块条目的 id 与包名绑定,二者不一致会在启动时编译失败(duplicate factory registration / entered the party 类报错)。

注册到 DSH

以 web profile(%USERPROFILE%\.dsh\profiles\web,即 ~/.dsh/profiles/web)为例。DSH 的组合结构是「分层 patch」:

- cordis.yml —— 自动生成的根文件(当前为 []),不要手改;
- package.json 的 dsh.profile.bundles —— 各 bundle 层(dsh-base、dsh-web-app),由安装的包提供;
- cordis.patch.yml —— 你的 patch 层(build.mjs 会自动写入插件行)。

正常流程:node build.mjs 一步到位

在插件目录执行一次 node build.mjs,安装 + 注册全部完成,写入的内容:

── 自动注册:dsh-plugin-login(由 build.mjs 写入,删除下列行即禁用)──
- insert:
- id: dsh-login
name: dsh-plugin-login

重复执行不会产生重复行。

手工流程(等价,可选)

cd %USERPROFILE%\.dsh\profiles\web
pnpm add file:

然后按上面格式手工编辑 cordis.patch.yml 即可(id 组合内唯一,name 为包名)。

注:pnpm 11 默认不执行 file: 依赖自身的生命周期脚本(Ignored build scripts),所以不能在 pnpm add 时自动写配置;自动写配置放在 node build.mjs 里完成。

重启启动 dsh web 的命令(按你实际的启动方式,例如 npx @deepseek-ai/dsh web),重新打开页面:

1. 页面应被登录界面全屏遮罩,任何滚动均被禁止;
2. 输入 haste / haste123456 → 进入应用,右下角出现「退出登录」胶囊;
3. 输错密码 → 红色错误提示 + 表单抖动。

如果没生效,先看 DSH 控制台是否有 client-modules: ... failed to compose 类报错(见下方排错表)。

卸载 / 禁用

从 cordis.patch.yml 移除(或注释掉)该 insert 行,或加上:

- id: dsh-login
disabled: true

然后重启。彻底移除依赖则再执行 cd %USERPROFILE%\.dsh\profiles\web && pnpm remove dsh-plugin-login。

开发迭代

1. 改 src/client.js(登录界面 / 校验逻辑 / CSS 都在这里)
2. 自动打包 + 安装 + 注册 + 同步(幂等,重复执行安全)
node build.mjs
3. 重启 dsh web,刷新浏览器

常见问题

| 现象 | 原因 / 处理 |
| 报 client bundle not found,提示 run pnpm run build before launch | exports["./client"] 指向的文件不存在:确认 client.js 已由 node build.mjs 生成且路径一致 |
| 报 duplicate factory registration / package resolves from multiple active Loader sources | 包名和 bundle 里 id 不一致,或同一包被插入了两条行:重新 build / 删除重复行 |
| 页面没变化 | 未运行 node build.mjs(它负责安装/写 patch/同步副本)、patch 行被误删、dsh 未重启,或 DSH_PROFILE/DSH_HOME 指向了别的 profile |
| pnpm add 报 ERR_PNPM_UNEXPECTED_STORE(v10/v11 store 不匹配) | 这台机器上有多个 pnpm 大版本。用当初安装该 profile 的同一个 pnpm 版本执行;或到 profile 目录先 pnpm install 统一 store,再重新安装 |
| 登录后刷新页面又要登录 | 预期行为:登录态只存在页面内存中(纯前端、无持久化)。要跨刷新记住登录,需要加 host 存储(见下文) |

安全说明与后续接入后端

当前校验是演示级:账号/密码由 node build.mjs 编译进 client.js(不指定时内置默认 haste / haste123456),纯前端比较,在浏览器源码里可见、可被绕过。

- 上线前把 check 换成真正的鉴权:客户端 host.call('login', {username, password})(Package 私有 RPC),由 Node 半边 harness.handle('login', ...) 校验并把结果写回(可借助 DSH credentials / storage 会话化)。
- UI 部分(登录界面、门禁、错误态、退出)不需要改动,只替换 check 的实现即可。

速查

node build.mjs # 打包+安装+注册+同步(默认 haste / haste123456)
node build.mjs admin admin@2024 # 自定义默认账号/密码
重启 dsh web → 访问页面 → 用构建时指定的账号登录
预览分享卡片长什么样 ↓Haste123/dsh-plugin-login
分享 · DeepSeek Harness Hub
Haste123/dsh-plugin-login

未登录时全屏遮罩,校验通过后才放行访问页面

这是你的仓库?认领条目

回到顶部