权限与信任边界
manifest/宿主权限交集、可撤销身份、UI 角色,以及插件、AI 和服务器的独立控制。
版本、变更与要求见 Framework 3.2 与 CLI 1.0。
有效权限
WU 将 manifest 请求与 shell grants 的交集作为权限。没有请求或 grants 时,应用不会获得技术 capabilities。添加应用未请求的 grant 也不会扩大其权限。
{
"name": "cart",
"entry": "assets/cart.js",
"wu": {
"permissions": [
{ "capability": "store.read", "resource": "cart", "required": true },
{ "capability": "store.write", "resource": "cart.items", "required": true },
{ "capability": "events.emit", "resource": "cart:changed" }
]
}
}
await wu.init({
apps: [{
name: 'cart',
url: '/apps/cart',
grants: [
{ capability: 'store.read', resource: 'cart' },
{ capability: 'store.write', resource: 'cart.items' },
{ capability: 'events.emit', resource: 'cart:changed' },
],
}],
});
required: true 要求请求被完整覆盖才能注册应用。可选请求可能被拒绝或仅部分覆盖;策略会保留诊断。可选并不意味着首次调用时就会自动授权。
支持的技术 capabilities
| 能力 | 操作 |
|---|---|
events.emit |
在获授权资源上发射事实事件 |
events.subscribe |
订阅允许的事件 |
rpc.provide |
提供总线 handlers 和方法契约 |
rpc.call |
请求响应并使用契约 |
store.read |
读取、获取快照并订阅路径 |
store.write |
对路径执行写入和 batch |
drag.offer |
在拖动中提供某一类型的数据 |
drag.accept |
在放置目标接受某一类型的数据 |
store.update 同时需要读取和写入权限。不存在任意的 device.*、deploy.* 或 build.* grants;列表在 wu-policy.js 中固定定义。
资源使用精确字符串或末尾通配符。对于 store,通配符必须占据完整路径段,如 cart.*。wu:、system: 和 app: 是事件发射与 RPC 提供/调用的保留命名空间。events.emit:* 请求会与它们重叠,不能用来授予全部宿主权限。
生命周期中的身份
core 为每个应用创建 lease,并提供冻结的 facade。每个方法检查 lease 是否仍有效;函数附加正确身份,不允许应用通过更改 appName 冒充其他应用。
卸载会撤销 facades 并清理关联资源。通过 facade 使用的契约也会被包装,在撤销后失败。全局变量保存的旧 facade 不会在同名应用重新挂载时恢复权限:新的生命周期会创建新身份。
在 4.0 中,全部十三个 adapters 的事件/store hooks 都遵循应用 facade。这保护了合作式调用,但 module 共享 realm,仍可访问 host。Shadow DOM 和同源沙箱无法隔离恶意代码;需要该边界时,应使用另一 origin 上的远程应用。
四类不同的控制
| 控制 | 决定什么 | 不决定什么 |
|---|---|---|
| WU 技术 grants | 总线、RPC 和 store 路径的使用 | 后端数据访问 |
setPrincipal / 角色 |
应用是否可以在 UI 中挂载 | 服务器上可靠的用户授权 |
| 插件权限 | 安装 API 提供哪些方法 | 约束已在宿主中执行的代码 |
| AI flags | AI actions 的读取、写入、DOM、网络或执行 | 远程操作的领域权限 |
插件配置使用另一份列表:mount、events、store、apps、config、unsafe。宿主必须明确授予请求的权限。AI actions 使用 executeActions、writeStore 和 network 等 flags。这些列表不能相互替代。
服务器边界
凭据、资源访问、幂等性和持久审计属于经过身份验证的服务。action handler 是宿主代码,可以在闭包中捕获 fetch 或高权限客户端;向 handler 提供的 API 无法约束该闭包。
对于具有副作用的操作,应设计 gateway,在执行前验证身份、参数、范围、策略和审批。Timeline 和 store 不会撤销发送、付款、build 或基础设施变更。如果领域允许撤销,需要实现明确的补偿操作。
wu-framework/server subpath 提供 createNonce、securityHeaders、buildCsp、middleware 和响应 wrappers。这些 helpers 构建响应头;实际安装由提供页面和资源的服务器负责。
受控迁移
await wu.init({
compatibility: { profile: 'compat-v2', warnings: 'once' },
apps: [],
});
console.table(wu.compatibility.getMigrationReport());
compat-v2 配置档启用针对 eventPermissions、插件隐式 grants 和 AI actions 隐式执行的特定兼容桥接。这是带诊断的显式迁移,不应成为新应用的基础配置。strictEvents: false 也是为可信代码提供的显式绕行选项,会减少总线检查。
实现参考
策略:src/core/wu-policy.js、src/core/wu-policy.js、src/core/wu-policy.js;leases:src/core/wu-core.js 和 src/core/wu-core.js;插件:src/core/wu-plugin.js;AI 默认值:src/ai/wu-ai-permissions.js;兼容性:src/core/wu-compatibility.js。测试:tests/unit/capability-security-v3.test.js、tests/unit/plugin-security.test.js、tests/unit/security-regressions.test.js、tests/security/compatibility-boundaries.test.js。