Skip to content

插件系统

Campux 插件系统允许通过插件扩展校园墙的功能,同时通过权限声明、审计日志和生命周期管理确保安全可控。

设计目标

  • 安全可控:每个插件必须声明所需权限,注册时校验,高风险权限产生警告
  • 可观测:所有插件操作(注册、状态变更、权限检查、请求/响应)均记录审计日志
  • 生命周期管理:插件通过 onInitonReadyonClose 钩子参与服务生命周期
  • 松耦合通信:插件间通过事件总线(发布/订阅)和标准化请求/响应进行通信

架构概览

核心概念

插件(CampuxPlugin)

插件是一个实现 CampuxPlugin 接口的对象,包含:

字段类型必填说明
namestring唯一名称,如 "campux-plugin-qzone"
versionstring语义化版本
descriptionstring插件描述
hooksPluginHooks生命周期钩子
permissionsPluginPermissions权限声明
campuxVersionstring兼容的 Campux 版本范围
enabledByDefaultboolean是否默认启用(默认 true

权限系统

插件通过 permissions 字段声明所需权限。注册时校验:未知权限会拒绝注册,高风险权限会产生警告日志。

可用权限:

权限风险说明
config:read读取全局配置
events:emit发布事件
events:listen订阅事件
db:read读取数据库
tenant:data访问租户数据
queue:worker注册后台 worker
db:write写入数据库
http:route注册 HTTP 路由
user:data访问用户数据

生命周期

register() → initAll() → [注册路由] → readyAll() → [服务运行] → closeAll()
                │                         │                        │
                ▼                         ▼                        ▼
            onInit()                   onReady()               onClose()
  • onInit:服务启动时调用,路由注册前。适合初始化连接、订阅事件。
  • onReady:所有路由注册完成后调用。适合发布就绪事件、启动后台任务。
  • onClose:服务关闭时调用。适合清理资源、关闭连接。

事件总线 (EventBus)

插件间通过事件总线进行松耦合通信:

  • 发布/订阅events.emit(event) 发布事件,events.on(type, handler) 订阅事件
  • 通配符events.on("*", handler) 订阅所有事件
  • 请求/响应events.request(req) 发送请求,events.onRequest(action, handler) 注册处理器
  • 异步发布events.emitAsync(event) 等待所有 handler 完成

内置事件类型:

事件触发时机
post:created新投稿创建
post:status_changed投稿状态变更
post:published投稿发布成功
post:recalled投稿撤回
review:approved审核通过
review:rejected审核拒绝
tenant:created校园墙创建
tenant:activated校园墙激活
tenant:paused校园墙暂停
tenant:archived校园墙归档
user:registered用户注册
user:joined_tenant用户加入校园墙
bot:message_received机器人收到消息
publish:attempted发布尝试完成

审计日志

所有插件操作自动记录审计日志,可通过 registry.getAuditLog()events.getAuditLog() 查询。

审计操作类型:

操作说明
plugin:registered插件注册
plugin:status_changed插件状态变更
plugin:permission_check权限校验
plugin:request_sent插件间请求发送
plugin:response_received插件间响应接收
plugin:error插件错误

插件上下文 (PluginContext)

插件通过 PluginContext 访问运行时资源:

ts
interface PluginContext {
  app: FastifyInstance;   // Fastify 实例
  config: CampuxConfig;    // 全局配置
  db: PrismaClientType;    // 数据库客户端
  events: EventBus;        // 事件总线
  logger: PluginLogger;    // 带插件名前缀的日志器
  queue: PluginQueue;      // 后台队列
}

安全设计

  1. 权限声明:插件注册时必须声明所需权限,未知权限拒绝注册
  2. 风险分级:权限分为 low / medium / high 三级,高风险权限注册时产生警告
  3. 审计追踪:所有插件操作记录审计日志,包含时间戳、操作类型、插件名、详情
  4. 状态管理:插件可被管理员禁用/启用,禁用后 initAll / readyAll 跳过该插件
  5. 错误隔离onReady 失败不中断其他插件,事件 handler 异常不中断其他 handler