
Memos 关闭密码登录后无法登录如何避免禁用密码认证后失去管理入口【免费下载链接】memosOpen-source, self-hosted note-taking tool built for quick capture. Markdown-native, lightweight, and fully yours.项目地址: https://gitcode.com/GitHub_Trending/me/memos在 Memos 中把disallowPasswordAuth禁止普通用户密码登录打开后最常见的事故是所有走密码登录的普通用户被挡在登录页外而管理员自己一时找不到还能用哪个入口进后台。Memos 对这件事有两层保护disallowPasswordAuth只拦截普通用户RoleUser管理员的密码登录路径始终可用同时运行时的设置修改和部署配置文件的启动校验都会拒绝“禁用密码认证但没有身份提供者IdP”这种会锁死所有人的状态。本文说明这两层保护具体在哪里生效、如何配合 SSO 正确关闭普通用户的密码登录以及已经处于锁定状态时管理员如何找回入口。先弄清两个登录入口的区别Memos 的登录页SignIn组件见 SignIn.tsx根据实例设置渲染当disallowPasswordAuth为true且没有任何身份提供者时登录页不显示密码表单而是显示“不可用”空状态并给出一个管理员登录admin-sign-in链接管理员登录页AdminSignIn.tsx复用同一个密码登录表单入口路由为ROUTES.AUTH_ADMIN。服务端在 auth_service.go 的SignIn中判断这一限制// Check if the password auth in is allowed. if instanceGeneralSetting.DisallowPasswordAuth user.Role store.RoleUser { return nil, status.Errorf(codes.PermissionDenied, password signin is not allowed) }注意判断里带了user.Role store.RoleUser只有普通用户会被拒绝错误为PermissionDenied: password signin is not allowedADMIN角色的密码登录不受该设置影响。也就是说文档中的设计目标是“preserve the administrator password sign-in path when password sign-in is disabled for regular users”见 docs/configuration-provisioning.md。结论一即使disallowPasswordAuth已经开着管理员仍然可以从登录页的“管理员登录”链接进入后台通过管理员账号的密码恢复控制。这是已发生锁定情况时的找回路径。为什么“禁用密码认证却没有 IdP”的状态进不来Memos 不允许通过正常操作把自己推进“普通用户无法登录且没有任何替代认证方式”的状态运行时修改UI/API更新GENERAL设置或删除 IdP 时存储层会在一个可串行化的数据库事务里读取当前的GENERAL设置与已存 IdP结合部署配置文件合并后的有效配置做校验。如果本次修改会让状态从“安全”变为“不安全”即disallowPasswordAuth true且有效 IdP 数量为 0修改直接被拒绝错误为 auth_config.go 中定义的ErrUnsafeAuthenticationConfiguration提示 “password authentication for regular users cannot be disabled without an effective identity provider”。删除最后一个有效 IdP 从安全状态出发同样会被拒绝。启动加载部署配置文件如果/etc/secrets下的GENERAL文件启用了disallowPasswordAuth而有效配置中没有任何身份提供者则“no snapshot is published and startup fails”——进程直接启动失败不会带病上线。还有一个针对遗留脏状态的例外如果数据库里本来就存在“禁用密码登录但无 IdP”的违规状态一次不相关的编辑可以保留这个已存在的违规避免升级后整个GENERAL组不可编辑。文档给出的解法正是“管理员启用密码登录或配置一个 IdP”——而管理员能做这两件事的前提就是上一条里始终可用的管理员密码路径。所以操作顺序只有一个正确写法先让至少一个 IdP 生效再打开disallowPasswordAuth。反过来做会被上面两层校验挡住启动失败或修改被拒绝不会真的锁死但你应该按正确顺序做。用 SSO-only 部署正确关闭普通用户密码登录推荐的完整配置依据 docs/configuration-provisioning.md 的 “SSO-only deployments”同时挂载一个 IdP 文件和一个GENERAL实例设置文件重启进程。文件由 Memos 在数据库迁移与 demo 种子之后扫描/etc/secrets直读修改文件必须重启进程才生效。创建/etc/secrets/memos-idp-primary-sso.json文档示例uid、OAuth2 各 URL 和字段映射换成你自己的 IdP 值id必须省略uid是必填的稳定键{ uid: primary-sso, name: Company SSO, type: OAUTH2, identifierFilter: , config: { oauth2Config: { clientId: client-id, clientSecret: client-secret, authUrl: https://idp.example.com/oauth/authorize, tokenUrl: https://idp.example.com/oauth/token, userInfoUrl: https://idp.example.com/oauth/userinfo, scopes: [openid, profile, email], fieldMapping: { identifier: sub, displayName: name, email: email, avatarUrl: picture } } } }创建/etc/secrets/memos-instance-setting-general.json把disallowPasswordAuth置为true文档示例{ key: GENERAL, generalSetting: { disallowUserRegistration: false, disallowPasswordAuth: true, additionalScript: , additionalStyle: , weekStartDayOffset: 1, disallowChangeUsername: false, disallowChangeNickname: false, customProfile: { title: Company Memos, description: Internal notes, logoUrl: https://example.com/logo.png } } }注意两个文档明确指出的点公共 demo 种子不包含认证策略所以IdP 文件和GENERAL文件必须同时挂载缺一个 SSO-only 行为就不成立如果希望首次 SSO 的用户自动建号disallowUserRegistration保持false实例设置文件是整组替换文件里省略的标量字段按 protobuf 默认值生效不会保留数据库里同组的旧值。重启 Memos 进程。启动日志会按资源类型输出匹配到的文件数量不打印文件内容文件名写错可以从日志看出来。验证方式访问登录页应看到 SSO 按钮IdentityProviderButtons密码表单消失passwordAuthAllowed为false用普通用户账号走 API 密码登录应返回PermissionDenied: password signin is not allowed——这正是期望结果说明限制已生效用管理员账号从“管理员登录”入口登录应成功进入后台——这是你的管理入口保障。已经锁定时如何找回管理入口如果现状是disallowPasswordAuth已开、普通用户全部无法登录打开登录页当没有 IdP 时页面会显示不可用空状态其中的“管理员登录”链接ROUTES.AUTH_ADMIN就是入口用管理员账号的密码登录服务端对该角色不做DisallowPasswordAuth拦截登录后按文档给出的两种解法之一恢复正常把disallowPasswordAuth改回false或先配置/恢复一个 IdP。注意删除“最后一个”有效 IdP 从安全状态出发会被拒绝恢复方向永远是先有 IdP、再关密码。另外两个容易踩的边界均来自 docs/configuration-provisioning.md旧版 bootstrap 留下的数据库 IdP早期版本的memos-idp-*.jsonbootstrap 会把 IdP含 client secret复制进idp表。新加载器发现文件与数据库中存在相同uid时只在启动日志里打一条不含密文的警告不会替你清理。文档给出的清理步骤是备份数据库并保留管理员密码访问 → 临时移除 IdP 文件并重启 → 通过管理员 UI 或 API 删除/更新数据库里的那条 IdP → 恢复文件并重启。清理完成前一旦文件被移除旧的数据库 IdP 会重新生效。文件托管的资源不可经 API 修改对文件托管的 IdP 做创建/更新/删除、或对文件托管的实例设置组做任何带 field mask 的更新API 一律返回codes.FailedPrecondition前端会原样展示该错误。遇到这个错误不是故障而是该配置归部署文件所有。限制disallowPasswordAuth的保护只保证管理员密码路径不保证普通用户的任何登录方式普通用户被锁后只能靠 IdP 或管理员介入文档没有提供普通用户自助找回路径。部署配置文件一次只加载、只在启动时校验文件变更必须重启进程不支持热加载。多个副本部署时每个副本各自加载文件所有副本必须挂载相同文件变更认证配置时应避免让新旧两代副本同时接流量。【免费下载链接】memosOpen-source, self-hosted note-taking tool built for quick capture. Markdown-native, lightweight, and fully yours.项目地址: https://gitcode.com/GitHub_Trending/me/memos创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考