JooLun Plus 百科 ⬇ 源码下载

03 凭据安全租户与权限

102353 于 2026-10-17 14:14:33 +08:00 修改了此页面

微信凭据安全、租户与权限

凭据密文存储

wx_app 中的以下字段通过 WxCredentialTypeHandler 自动加解密:

  • secret
  • token
  • aes_key

Pro 的商户密钥与证书由独立支付模块管理,不纳入本模块凭据轮换。

数据库中保存的是带版本信息的 WXENC 密文,业务服务读取实体时得到明文。接口、日志、异常和页面都不应输出完整明文。

WX_CREDENTIAL_KEY_V1

密钥要求:

  • 原始长度必须为 32 字节。
  • 使用 Base64 传入环境变量。
  • 同一环境的所有微信后台实例保持一致。
  • 生产、预发布、测试环境使用不同密钥。
  • 保存到密钥管理系统或部署平台 Secret,不能进入 SQL、Git、截图和工单正文。

生成后配置到所有微信后台实例,并通过账号健康中心确认凭据可以正常解密和获取 access token。

密钥轮换

密钥环支持多版本:

wx:
  credentials:
    primary-key-id: v2
    keys:
      v1: ${WX_CREDENTIAL_KEY_V1:}
      v2: ${WX_CREDENTIAL_KEY_V2:}

推荐步骤:

  1. 新增 v2,暂时保留 v1。
  2. 发布全部实例并确认都能读取旧密文。
  3. 将 primary-key-id 切换为 v2。
  4. 在账号健康中心执行凭据轮换或重新保存账号。
  5. 确认数据库密文版本和凭据检测正常。
  6. 确认所有凭据均已按 v2 重新加密后,才允许移除 v1。

任何实例仍使用旧配置时都不能提前删除旧密钥。

凭据与 API 权限分离

敏感操作使用独立权限:

能力 权限
凭据检测 wx:wxapp:credential:check
API 额度清零 wx:wxapp:quota:reset
健康检查 wx:wxhealth:check
密钥轮换 wx:wxhealth:rotate
API 调用诊断 wx:wxapilog:diagnose
API 额度操作 wx:wxapilog:quota

不要把所有按钮权限直接授予普通运营角色。额度清零、密钥轮换、平台域名和 Open Platform 解绑应只授予平台管理员。

租户隔离

后端服务必须遵循:

  1. 从 TenantContextHolder 获取租户。
  2. 查询 wx_app 时显式带 tenant_id。
  3. 校验账号存在后再校验 app_type。
  4. 账号下拉只返回非敏感字段。
  5. 微信回调根据可信 AppID 定位账号,但业务查询仍按租户授权。

典型错误“微信应用类型不正确”表示页面把公众号 AppID 传给小程序接口,或反之。消息、推广、客服三个运营模块的账号选择共用 /weixin/wxapp/list,显式传入 appType=1(小程序)或 appType=2(公众号)。服务端按实际账号类型和当前用户权限再次校验;其他专用工作台保留各自的账号资格查询接口。

权限命名

前缀 范围
wx:* 平台级微信运营、第三方平台和可观测性
wxmp:* 微信公众号能力
wxma:* 微信小程序能力

页面按钮权限和后台接口权限必须保持一致。角色授权时应同时检查父菜单和具体操作按钮。

日志脱敏

禁止记录:

  • access token、component access token、authorizer access token。
  • AppSecret、Token、EncodingAESKey、商户密钥。
  • 完整身份证件、备案材料和支付证书。
  • 用户手机号、OpenID 等不必要的批量明文。

允许记录用于排障的 AppID、微信错误码、接口类别、耗时、请求摘要和脱敏后的响应摘要。

最小权限建议

  • 运营:页面查看、内容编辑、消息发送、发布流程。
  • 客服:客服账号、会话、聊天记录、输入状态。
  • 版本验证人员:代码模板、体验成员、预览、提交审核,不授予线上发布。
  • 运维:健康、API 日志、事件重放、告警处理。
  • 平台管理员:第三方平台配置、授权账号、平台域名、Open Platform 绑定和密钥轮换。