You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 19:02:57