Wekan 密码登录禁用指南:环境变量语义、源码实现与 Snap / Docker / 自托管全平台配置
【免费下载链接】wekanThe Open Source kanban, built with Meteor. GitHub issues/PRs are only for FLOSS Developers, not for support, support is at https://wekan.fi/commercial-support/ . PR source translation to imports/i18n/data/en.i18n.json, other translations at https://app.transifex.com/wekan/wekan项目地址: https://gitcode.com/GitHub_Trending/we/wekan
导读
Wekan 是基于 Meteor 构建的开源看板应用,其登录界面默认同时提供用户名/密码表单与各种第三方登录按钮。在启用 LDAP、OAuth2/OIDC、CAS、SAML 等企业身份源后,通常希望隐藏密码表单,强制用户仅通过单点登录(SSO)入口进入系统。本文以 Disable-Password-Login.md 为主干,结合源码解释PASSWORD_LOGIN_ENABLED环境变量的底层实现机制,并给出 Snap、Docker、Windows On-Premise、Linux On-Premise 四种部署形态的完整配置命令与验证方法。读完本文,你将掌握如何在不影响现有账号的前提下,把 Wekan 登录页收敛为纯 SSO 登录入口。
一、功能概述:隐藏密码表单而非禁用账号
该功能的行为描述非常明确(Disable-Password-Login.md):
在登录界面不显示密码登录表单,只显示登录按钮(OAuth2、LDAP 等)。
需要注意两个关键边界:
- 只影响登录界面的展示层:它隐藏的是
.at-pwd-form(用户名 + 密码输入表单),而不是删除账号或禁止loginWithPassword能力; - 默认行为是"开启":只有显式把
PASSWORD_LOGIN_ENABLED设为字符串'false'时密码登录才被隐藏,未设置或设为其它值时密码登录照常显示。这一"默认开启、显式关闭"的语义,避免了误配置导致所有用户被锁在系统之外。
二、源码级实现原理
2.1 服务端判定:严格的字符串比较
判定逻辑位于 server/models/settings.js:
isPasswordLoginEnabled() { return !(process.env.PASSWORD_LOGIN_ENABLED === 'false'); },这是一个纯环境变量读取函数,没有任何数据库持久化、也没有正则解析——PASSWORD_LOGIN_ENABLED只有精确等于小写字符串'false'时才算"禁用密码登录"。因此:
PASSWORD_LOGIN_ENABLED=false→ 隐藏密码表单;PASSWORD_LOGIN_ENABLED=true/ 未设置 / 其它任意值 → 显示密码表单。
从源码结构看,该方法作为 Meteor 方法暴露给客户端调用(同文件Meteor.methods块),供登录页在渲染阶段远程查询。
2.2 客户端渲染:先藏后显的防抖机制
登录页模板在 client/components/main/layouts.js 中处理显示逻辑,设计上有两个值得注意的点:
- CSS 默认隐藏:
.at-pwd-form、.at-sep(分隔线)、.at-oauth(OAuth 按钮区)在 client/components/main/layouts.css 中统一display: none;,等待 JavaScript 异步判定后再显示; - fail-open 容错:客户端调用
isPasswordLoginEnabled后,只有明确收到result === false才保持隐藏;其它情况(方法报错、返回迟到)都会等待.at-pwd-form元素出现并show()出来。相关注释(Issue #6380)明确指出:只有当密码登录被显式禁用时才隐藏表单,防止网络抖动导致登录页意外丢失用户名/密码输入框。
同时,该方法与getAuthenticationsEnabled(server/models/settings.js)配合使用:后者返回ldap、oauth2、cas、saml及各个 Meteor accounts-* 提供方(含passwordless)的启用布尔值,客户端据此为每个已启用的身份源渲染一个"Sign In with …"按钮。也就是说,登录页的最终形态是:密码表单是否可见由isPasswordLoginEnabled决定,各 SSO 按钮是否可见由getAuthenticationsEnabled决定。
2.3 客户端状态同步:accounts.js 中的缓存变量
config/accounts.js 在客户端维护一个passwordLoginEnabled变量,通过Meteor.call('isPasswordLoginEnabled')异步同步服务端判定结果,供 accounts-templates 表单配置使用。这套机制同样服务于"忘记密码链接"(isDisableForgotPassword)、"注册开关"(isDisableRegistration)等同族开关,说明 Wekan 把登录页各子元素的显隐统一建模为一系列可查询的布尔状态。
三、全平台配置命令
3.1 Snap 安装
Snap 安装版通过snap set配置,键名为password-login-enabled(Snap 的配置键把环境变量名转成连字符形式):
sudo snap set wekan password-login-enabled='false'该键的默认值、说明与映射关系定义在 snap-src/bin/config:
DESCRIPTION_PASSWORD_LOGIN_ENABLED="To hide the password login form" DEFAULT_PASSWORD_LOGIN_ENABLED="true" KEY_PASSWORD_LOGIN_ENABLED="password-login-enabled"Snap 安装版的完整命令帮助列表位于 snap-src/bin/wekan-help,其中也包含了logout-on-minutes、default-authentication-method等相邻登录相关配置。
3.2 Docker
Docker 部署(docker-compose 或docker run -e)使用环境变量形式,注意变量名带前缀PASSWORD_LOGIN_ENABLED,值必须是小写false:
- PASSWORD_LOGIN_ENABLED=false在 docker-compose.yml 的 wekan 服务段落中,该配置以注释形式预置(# Hide password login form/# - PASSWORD_LOGIN_ENABLED=true),取消注释并把true改为false后执行docker compose up -d即可生效。仓库中其它 compose 变体(docker-compose-mongodb-v7.yml、各 docker-compose-ferretdb-*.yml 等)以及 Dockerfile、sandstorm-pkgdef.capnp 中同样识别这一环境变量。
3.3 Windows On-Premise
Windows 本地部署(非 Docker)在start-wekan.bat中通过SET设置,配套的离线安装指引见 Windows 离线部署文档:
SET PASSWORD_LOGIN_ENABLED=falsestart-wekan.bat中预置了对应的注释模板(start-wekan.bat):
REM # Enable/Disable password login form. REM SET PASSWORD_LOGIN_ENABLED=true把REM去掉、将值改为false后重新启动 Wekan 服务即可。
3.4 Linux On-Premise
Linux 本地部署在start-wekan.sh中通过export设置,树莓派等设备的部署说明见 Raspberry Pi 部署文档:
export PASSWORD_LOGIN_ENABLED=falsestart-wekan.sh 中同样预留了注释模板:
# PASSWORD_LOGIN_ENABLED : Enable or not the password login form. #export PASSWORD_LOGIN_ENABLED=true取消注释并改为false,随后重启 Wekan。该脚本同时出现在 releases/virtualbox/start-wekan.sh,VirtualBox 镜像的部署方式一致。
3.5 各部署形态参数对照
| 部署形态 | 配置方式 | 键名 / 变量名 | 禁用取值 |
|---|---|---|---|
| Snap | snap set | password-login-enabled | 'false' |
| Docker / docker-compose | 环境变量 | PASSWORD_LOGIN_ENABLED | false |
| Windows On-Premise | SET | PASSWORD_LOGIN_ENABLED | false |
| Linux On-Premise | export | PASSWORD_LOGIN_ENABLED | false |
四、实战组合:构建"纯 SSO 登录"环境
要真正实现"登录页只剩第三方登录按钮",通常还需要配合以下开关:
- 启用身份源:分别配置 LDAP、OAuth2/OIDC、CAS 或 SAML 中至少一种,使其在
getAuthenticationsEnabled中返回true,登录页才会出现对应按钮; - 隐藏密码表单:按上文任一方式设置
PASSWORD_LOGIN_ENABLED=false; - 可选——隐藏注册与忘记密码入口:
DISABLE_REGISTRATION与DISABLE_FORGOT_PASSWORD是同一套机制的同类开关(config/accounts.js 中客户端会通过isDisableRegistration/isDisableForgotPassword隐藏.at-signup-link与.at-pwd-link),配合使用可进一步收敛登录页; - 可选——密码无感登录:Wekan 还支持基于 Meteor
accounts-passwordless的免密码登录(见 Passwordless 登录文档),以及 HTTP Header 登录,它们与密码表单是相互独立的能力。
需要特别澄清的是:PASSWORD_LOGIN_ENABLED=false不会影响DEFAULT_AUTHENTICATION_METHOD的取值。后者(如设为ldap)只决定"新用户默认用哪种方式创建与认证",在 start-wekan.sh 的注释中明确写着"这不会移除密码登录选项"。两者职责不同:一个管登录页展示,一个管账号创建路由。
五、验证与回滚
验证方法:重启服务后打开登录页,确认不再出现"用户名 + 密码"输入框与"忘记密码"链接,仅保留已启用的 SSO 登录按钮;同时用已有密码账号直接访问受保护 URL,确认会被重定向到登录页(而非报错),因为该开关并不吊销任何既有凭据。
回滚方法:把配置值恢复为true(Snap 为password-login-enabled='true',其余为PASSWORD_LOGIN_ENABLED=true)并重启服务。由于开关完全基于环境变量且默认开启,回滚不会产生任何数据迁移成本。
六、小结
PASSWORD_LOGIN_ENABLED是 Wekan 中实现"仅 SSO 登录"的核心开关:服务端以严格字符串比较判定(server/models/settings.js),客户端以"CSS 默认隐藏 + 异步显式显示"的 fail-open 策略渲染(client/components/main/layouts.js),并在 Snap、Docker、Windows、Linux 四种部署形态下提供等价配置入口。它只影响登录界面展示,不删除账号、不影响已配置的 OAuth/LDAP/CAS/SAML 按钮,配合DEFAULT_AUTHENTICATION_METHOD、DISABLE_REGISTRATION等相邻开关,可以为企业环境搭建一个干净、可控的 SSO 专属登录入口。相关的进阶登录能力(如 Two-Factor-Authentication、Accounts-Lockout)可在 docs/Features/Login 目录下继续查阅。
【免费下载链接】wekanThe Open Source kanban, built with Meteor. GitHub issues/PRs are only for FLOSS Developers, not for support, support is at https://wekan.fi/commercial-support/ . PR source translation to imports/i18n/data/en.i18n.json, other translations at https://app.transifex.com/wekan/wekan项目地址: https://gitcode.com/GitHub_Trending/we/wekan
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考