跳到主要内容

用户、登录与工作区

适用版本

本文档基于 Aivory v2.4.7 编写。相关界面:“用户与访问 → 用户 / 注册策略 / 登录方式 / 工作空间”。反向代理与 HTTPS 前置配置见域名、HTTPS 与 OAuth

访问控制决定谁能进入实例、以何种方式登录、能看到哪些资源,以及管理员在异常时如何处置账号。顺序原则:先保住了至少一个可恢复的管理员登录路径,再收紧注册和登录策略;不要在未验证 OAuth 或管理员密码前关闭唯一入口。

用户生命周期

“用户与访问 → 用户”支持搜索、创建和维护账号,并可下钻查看单个用户的对话、内容库、记忆、登录历史与用量:

操作要点
创建/修改账号确认邮箱归属、显示名、角色和初始密码;不要通过聊天、截图或工单发送明文密码
提升管理员只对受信任人员授予:管理员可读取运营数据、修改渠道、导出含明文凭据的配置
暂停或封禁适合安全事件、滥用或离职处理;先记录原因、时间和负责人,封禁会终止该用户的活跃会话
重置密码 / 关闭 2FA先核验身份,操作后通知账号所有者并留审计记录
删除用户影响数据的不可逆操作:先确认法律保留、工作区所有权、共享资料与备份;删除≠暂时禁用
账号删除的异步清理

删除用户会先登记待清理对象路径,再执行破坏性 SQL,物理删除在启动时清扫。排查“文件还在吗”这类问题时以“数据与运营 → 文件”视图为准。

用户列表

注册策略

“用户与访问 → 注册策略”集中了入口开关(页面保存前会检查当前管理员自身的身份源绑定,避免把自己锁在门外):

字段说明默认
允许邮箱密码注册关闭后禁止直接注册,不影响第三方登录各自的注册开关
注册需要验证码新注册需完成滑块拼图验证码
登录需要验证码每次密码登录先完成滑块拼图,可延缓撞库
单 IP 每日注册上限0 = 不限制0
要求邮箱验证新注册用户须输入 6 位邮箱验证码才能登录(验证码 10 分钟有效,错 5 次作废,需 SMTP)
允许注册的邮箱域名逗号分隔;留空允许所有域名

企业登录策略(同页)

字段说明默认
允许本站邮箱密码登录关闭后只剩第三方身份源入口
未登录入口显示普通登录页 / 仅显示第三方登录 / 自动跳转到身份源登录页
默认身份源“自动跳转”模式下未登录用户直接进入该身份源的授权页
允许第三方登录创建新账号关闭后仅已绑定账号可第三方登录
第三方账号初始密码必须设置 / 可选设置 / 禁止设置可选
关闭密码登录之前

“仅显示第三方登录”或“自动跳转”都要求至少存在一个已启用且配置完整的身份源;关闭密码登录时也不能同时要求第三方账号“必须设置本站密码”(页面会拒绝该组合)。务必先在另一个浏览器或无痕窗口用测试账号走通登录,再关闭原入口。

推荐的公共部署基线:初期关闭开放注册或用邮箱域名白名单收紧 → 需要开放时启用验证码 + 邮箱验证 + 合理的单 IP 限制 → 为管理员保留至少一个已验证的登录路径 → 发布前用非管理员测试账号完整走一遍注册、验证、登录、登出、刷新、重置密码和被禁用后的行为。

注册策略页

典型场景的开关组合

场景建议组合
个人自用关闭开放注册;邮箱验证与验证码全部关闭;需要他人使用时在“用户”页手工建号,初始密码通过安全渠道单独交代
邀请制内测保持关闭开放注册;管理员手工建号、按批次发放;SMTP 可以在这个阶段之后再配
公开社区开放注册 + 注册与登录验证码 + 邮箱验证(SMTP 就绪后)+ 合理的单 IP 每日上限;默认用户组收紧额度,并准备好封禁与申诉流程
企业内网关闭邮箱密码注册与本站密码登录,仅保留通用 OIDC / OAuth2 身份源;“未登录入口”设为自动跳转并指定默认身份源;第三方自动建号按组织策略显式决定

任何开关组合改动后,先用无痕窗口的新账号完整走一遍注册 → 登录 → 退出,再对全员生效。

验证码与邮箱机制细节

  • 滑块拼图验证码:前端从 GET /api/public/captcha 领取拼图,通过后换取一次性通行令牌(POST /api/public/captcha/verify)。挑战约 2 分钟过期、通行令牌约 10 分钟且一次一用。老浏览器截图/代理缓存拼图会导致“明明滑对了仍失败”,换无痕窗口重试即可判断。
  • 邮箱验证/重置:6 位数字码,10 分钟有效,错 5 次作废重发;两者都依赖 SMTP 已配置。
  • 登录审计登录历史 是不可篡改的成功登录记录(设备、IP、时间),下钻在用户详情页;它只记成功登录,爆破尝试请看应用日志与速率限制行为。

OAuth 登录方式

“用户与访问 → 登录方式”支持五个内置/通用类型:Google、GitHub、Apple、通用 OAuth 2.0、通用 OIDC。上线一个身份源的安全步骤:

  1. 先完成公开 HTTPS 域名与反向代理(回调地址必须是浏览器可达的正式域名)。
  2. 在服务商侧创建应用:
    • Google:Cloud Console → 凭据 → OAuth 客户端(授权码 + PKCE)。
    • GitHub:Settings → Developer settings → OAuth Apps。
    • Apple:创建 Services ID 与 AuthKey(.p8),Client Secret 由 Aivory 用 .p8 现场签发的 JWT 承担。
    • 通用 OAuth2 / OIDC:向 IdP 要授权、令牌、(可选)用户信息端点。
  3. 在“登录方式”点“添加登录方式”,把表单显示的“回调地址(Redirect URI)”原样复制到服务商控制台——该地址保存后不会变化。它形如:
https://aivory.example.com/api/auth/oauth/<提供方ID>/callback
  1. 填回 Client ID / Client Secret 等凭据并启用,用测试账号验证:新用户创建、已有账号登录、以及在个人设置中的显式账号绑定/解绑。
  2. 检查邮箱匹配、自动创建、初始密码策略和用户组分配符合预期后,再向真实用户开放入口或设置自动跳转。

各类型字段(表单按类型显示所需项):

字段适用说明
登录方式 / 按钮文字 / 图标全部按钮文字与图标显示在登录页
Client ID / Client Secret全部Apple 此处上传 .p8 私钥;编辑时留空保留原密钥
Team ID / Key IDApple签发 client-secret JWT 所需
签发者地址 (Issuer URL) / JWKS URLOIDC校验 ID Token 的签发方与签名密钥
授权 / 令牌 / 用户信息地址通用 OAuth2按提供商文档填写
Scopes通用OAuth2 按文档;OIDC 留空用 openid email profile
启用(在登录页显示)全部
多域名与 token_exchange_failed

多个公开域名时,用 OAUTH_CALLBACK_BASE_URL 固定回调规范主机、OAUTH_RETURN_ORIGINS 白名单允许的返回源(跨域一次性 handoff 令牌 60 秒有效),见域名、HTTPS 与 OAuth。第三方登录出现 token_exchange_failed 时,账号绑定正常不代表服务器出网正常:检查服务器到服务商 token endpoint 的 HTTPS、DNS、代理、防火墙与系统时间(令牌交换超时约 40 秒、state 有效期 10 分钟),不要反复解绑用户账号。

登录方式页(空状态)

两步验证与会话安全

用户在前台个人设置中启用 TOTP 两步验证(错误码连续 5 次作废本次设置);管理员可在核验身份后为用户关闭。2FA 不能替代:强且唯一的管理员密码、对 JWT_SECRET/数据库密码/OAuth Secret 的保护、HTTPS 与 Cookie 正确配置、对被盗设备及时封禁和会话撤销。

会话机制(管理员排障需要知道的):

机制事实
令牌形态短期访问令牌(默认 30 分钟,ACCESS_TTL)+ 长期刷新令牌(默认 30 天,REFRESH_TTL,轮换、逐条入库可撤销),经 HttpOnly Cookie 或 Bearer 头下发
版本化撤销每个访问令牌携带 token 版本与会话族 ID;改密、管理员封禁或用户撤销会话后,下一个请求即全网失效(多副本同样生效)
会话管理用户在个人设置查看活动会话(设备/IP/位置/最后在线)并可逐个撤销;无“全部退出”之外的后门
请求签名认证后的写操作默认要求一次性 HMAC 签名请求(防重放窗口:时间戳超前 ≤300 秒、滞后 ≤60 秒)。客户端时钟严重偏移会表现为“request signature expired”;AIVORY_REQUEST_SIGNATURES_REQUIRED=false 可关闭(降低防护,仅调试用)
CSRF 源Cookie 携带的跨站请求必须 Origin 匹配 ALLOWED_ORIGINS,否则 403“cross-site request blocked”——这是域名部署后最常见的“登录成功但一切写操作失败”的原因

登录页:邮箱密码 + 第三方登录入口

登录与访问故障速查

症状优先检查
登录后一切写操作 403“cross-site request blocked”ALLOWED_ORIGINS 是否精确等于浏览器 Origin(无路径、无尾斜杠、逗号分隔)
“request signature expired”客户端/服务器时钟偏移(窗口:超前 ≤300s、滞后 ≤60s);代理是否改写了 /api 前缀或查询串
刚改密/被封禁的账号仍在使用理论上下一个请求即失效;确认请求命中的是同一数据库而非旧副本
第三方登录跳回后仍是未登录多域名时 OAUTH_CALLBACK_BASE_URL / OAUTH_RETURN_ORIGINS 未配置,handoff 被拒(60 秒一次性令牌)
收不到验证邮件但 SMTP 测试发送正常发件域 SPF/DKIM 缺失进垃圾箱;或邮箱域名白名单把它拦在注册前
反复要求重新登录(本地开发)未设 JWT_SECRET,重启即换密钥
用户说“登录不上”但后台能查到成功记录检查其是否被要求邮箱验证、或账号状态被暂停

TTL 调整入口在环境变量:ACCESS_TTL(默认 30m)与 REFRESH_TTL(默认 720h)。缩短访问令牌能压缩泄露窗口,刷新令牌长度则在用户便利与设备风险间权衡。

用户组与工作空间

用户组(套餐)承载一组账号的默认可见模型、额度、积分与权限,见套餐、积分与支付。建议为管理员、内部员工、试用、付费和受限用户定义清晰少量分组,不制造难以追踪的例外组合。

工作空间用于团队协作(前台创建,管理端“工作空间”页检视与删除):

  • 明确所有者与转移规则:创建者离开后谁接管。
  • 成员能力是逐项授权(会话、项目、知识库、文件等粒度开关),工作空间策略还能进一步收窄允许模型、工具与 MCP、月度积分限额——只做减法
  • 邀请链接设置合理有效期与使用次数,用后即撤;历史邀请令牌不会成为旁路。
  • 不同客户、法律实体或保密级别的数据放独立工作空间,不依赖口头约定隔离。
  • 审计:工作空间操作留审计日志,且记录不随工作空间删除而消失;元数据不含令牌、密钥与请求体。

平台管理员保留个人空间。域锁定功能只作用于被邮箱域规则绑定的普通用户;拥有平台 admin 角色的账号仍可在个人空间与工作空间之间切换。若需要限制某个管理员,应先调整账号角色,再在域名入组与工作空间访问中配置域规则或单用户例外。

组织域名入组请查看独立的域名入组与工作空间访问页面,那里说明精确域名匹配、命中注册时强制验证、只对未来账号生效、个人空间锁定以及 /admin/workspaces 负责人流程。

变更角色、用户组或工作区成员后,用低权限测试账号实际验证访问被正确收紧或放开,不要只从管理员视图判断权限。

权限面速查

层级控制什么在哪配
账号角色user / admin用户详情页
用户组权限功能开关(分享、知识库、上传、语音、记忆、绘图…)与资源目录(提示词/技能/工具/MCP 的全部/指定/无)用户组 → 权限
模型权限模型对哪些组可用、按费用/次数限额模型页权限区块 + 用户组额度
工作空间策略允许模型/工具/MCP 白名单、功能开关、成员月度积分上限(只收窄)工作空间所有者设置
成员能力项逐成员细粒度 can_* 开关工作空间成员管理
全局工具禁用一键从所有模型移除某工具能力与集成 → 工具

异常事件处置顺序

  1. 确认影响面:登录历史、异常用量(“用量与计费”按用户维度)、该用户参与的共享资源清单。
  2. 止血优先于取证:封禁账号或下调用户组即可即时终止会话、冻结入口;不需要先删数据。
  3. 撤销凭据:若怀疑泄露,轮换涉及的管理员密码并撤销全部会话(个人设置 → 会话管理);管理员封禁会连带终止该账号所有刷新令牌。
  4. 保留证据:导出前记录订单号/事件 ID/时间线;“删除用户”会让用量记录匿名化而非消失。
  5. 复盘收紧:把这次攻击面翻译成注册策略、验证码或 IP 限制的具体开关,写进变更日志。

安全运营检查表

  • 至少保留两个独立、可恢复的管理员登录路径,并妥善保存恢复流程。
  • 定期轮换 OAuth、SMTP、模型渠道和存储密钥;轮换后做真实登录与发送测试。
  • 开启注册或自动创建前,明确允许的用户范围、邮箱域名和滥用处理机制。
  • 定期审阅登录历史、异常地区/IP、失败登录峰值与高频注册;用多信号组合而不是单一指标判断攻击。
  • 删除、封禁、导出或恢复数据前,记录操作者、原因、范围和回滚方案。