如何使用Capability Guard让module1的函数仅被module2调用?
使用Capability Guard限制Module1函数仅被Module2调用的实现方案
一、用Capability Guard实现Module1函数仅允许Module2调用
Capability Guard的核心逻辑是通过私有能力令牌做权限校验:只有持有合法令牌的调用者(即Module2)才能触发目标函数。
代码实现(以JavaScript为例)
Module1 代码
// module1.js // 私有令牌,仅Module1内部可访问,外部无法直接获取 const module2AccessToken = Symbol('module2-exclusive-token'); // 受保护的目标函数,实际业务逻辑写在这里 function _internalRestrictedFunction(...args) { console.log('执行受保护函数,参数:', args); } // 仅向Module2开放的授权接口,返回绑定令牌的函数引用 export function grantModule2Access() { return { restrictedFunction: (...args) => _internalRestrictedFunction(...args) }; } // 对外暴露的原始函数(无令牌则拒绝调用) export function restrictedFunction(token, ...args) { if (token !== module2AccessToken) { throw new Error('无权限调用此函数'); } _internalRestrictedFunction(...args); }
Module2 代码
// module2.js import { grantModule2Access } from './module1.js'; // 获取专属的合法调用能力 const { restrictedFunction } = grantModule2Access(); // 正常调用受保护函数 restrictedFunction('测试参数1', '测试参数2');
逻辑说明
- Module1内部维护私有令牌
module2AccessToken,外部模块无法直接获取; grantModule2Access是专属授权入口,返回的函数已绑定令牌,Module2无需手动处理令牌细节;- 其他模块若直接导入
restrictedFunction,因无法获取合法令牌,调用会触发权限错误。
二、让Module1特定函数仅在Module2作用域内执行的可行方案
要实现“仅在Module2作用域内可调用”,可以结合闭包绑定+作用域标识校验,确保函数只能在Module2的上下文环境中执行。
方案一:闭包绑定Module2作用域
// module1.js export function createScopedFunctionForModule2(module2Context) { // 校验上下文是否为Module2的合法标识 if (module2Context?.moduleUniqueId !== 'module2-unique-id') { throw new Error('仅允许Module2作用域调用'); } // 返回的函数依赖Module2的私有变量,脱离该作用域无法正常执行 return function scopedRestrictedFunction() { console.log('仅在Module2作用域执行,依赖变量:', module2Context.internalVar); }; }
Module2 代码
// module2.js import { createScopedFunctionForModule2 } from './module1.js'; // 定义Module2专属上下文,包含唯一标识和内部变量 const module2Context = { moduleUniqueId: 'module2-unique-id', internalVar: 'Module2内部私有变量' }; // 创建仅能在Module2作用域执行的函数 const scopedFunction = createScopedFunctionForModule2(module2Context); // 正常执行 scopedFunction();
方案二:调用栈辅助校验(补充方案)
如果需要更严格的来源校验,可结合调用栈检查判断调用方是否为Module2:
// module1.js function isCallFromModule2() { const callStack = new Error().stack; // 根据运行环境,检查栈信息是否包含Module2的文件路径/标识(代码压缩后可能失效) return callStack.includes('module2.js'); } export function scopedFunction() { if (!isCallFromModule2()) { throw new Error('仅允许在Module2作用域内调用'); } // 函数业务逻辑 }
方案说明
- 闭包绑定作用域的方式最可靠,通过依赖Module2的私有变量,确保函数无法脱离Module2环境执行;
- 调用栈校验仅作为补充,不能单独作为唯一校验方式,因为栈信息可能被篡改或压缩后丢失。
内容的提问来源于stack exchange,提问作者Nexion21
相关产品推荐
相关产品推荐

