使用 LLDAP 为 Tandoor Recipes 配置 LDAP 认证:环境变量详解与实现原理
后端认证鉴权【免费下载链接】lldapLight LDAP implementation项目地址https://gitcode.com/gh_mirrors/ll/lldap点击查看免费下载LLDAPLight LDAP implementation是一个轻量级、面向自托管场景的 LDAP 身份认证服务器而 Tandoor Recipes 是一套流行的家庭菜谱管理应用原生支持通过 LDAP 进行外部认证。本文以仓库中的 Tandoor Recipes 集成指南 为骨架逐项解析 Tandoor 侧的全部 LDAP 环境变量必填、可选、TLS 三类并对照 LLDAP 的 LDAP 服务端实现crates/ldap说明每个配置项背后 LLDAP 如何应答帮助读者完成一次可复现、可排错的真实对接。前置准备LLDAP 侧需要确认的三件事在配置 Tandoor 之前请先在 LLDAP 侧确认以下三点否则即使环境变量完全正确也无法登录Base DN 与命名空间LLDAP 默认的 Base DN 为dcexample,dccom参见 lldap_config.docker_template.toml 中的ldap_base_dn配置项。所有用户位于oupeople,base_dn所有组位于ougroups,base_dn。本文所有 DN 均基于该默认值如果你的 LLDAP 实例配置了其他 Base DN请同步替换。Bind 账号推荐使用只读账号绑定而不是管理员账号。LLDAP 内置了lldap_strict_readonly严格只读与lldap_password_manager可改密码等内置组README 明确指出多数 LDAP 集成应使用这些组的成员而非lldap_admin以免把完整管理权限授予外部服务见 README.md 的 General configuration guide 一节。仓库测试中也大量使用lldap_strict_readonly组用户作为绑定账号见 crates/ldap/src/handler.rs 中的setup_bound_handler_with_group(mock, lldap_strict_readonly)。端口与网络LLDAP 的 LDAP 端口默认是3890ldap_port配置项。在容器化部署中建议把 LLDAP 与 Tandoor 放入同一 Docker 网络使用服务名如lldap:3890互相访问不必把 LDAP 端口暴露到公网。必填环境变量告诉 Tandoor 去哪里找 LLDAP原文档给出的必填配置如下LDAP_AUTH1 AUTH_LDAP_SERVER_URIldap://lldap:3890/ AUTH_LDAP_BIND_DNuidro_admin,oupeople,DCexample,DCcom AUTH_LDAP_BIND_PASSWORDCHANGEME AUTH_LDAP_USER_SEARCH_BASE_DNoupeople,DCexample,DCcom逐个说明LDAP_AUTH1Tandoor 的认证方式开关置 1 启用 LDAP 认证。AUTH_LDAP_SERVER_URIldap://lldap:3890/LLDAP 服务地址。lldap是容器服务名3890是 LLDAP 默认 LDAP 端口。注意结尾斜杠。AUTH_LDAP_BIND_DNuidro_admin,oupeople,DCexample,DCcomTandoor 启动时用它绑定到 LLDAP 的账号 DN。注意这里使用uidro_admin而不是 LLDAP 管理员常见的cnadmin——LLDAP 的用户条目 DN 格式为uiduser_id,oupeople,base_dn见 crates/ldap/src/core/user.rs 中make_ldap_search_user_result_entry对dn的拼装。因此你需要在 LLDAP 里创建一个名为ro_admin的只读用户或任何你命名的只读账号并把它加入lldap_strict_readonly组。DCexample,DCcom与 LLDAP 的 Base DN 大小写不敏感可写为小写。AUTH_LDAP_BIND_PASSWORDCHANGEME上述只读账号的密码务必替换。绑定的底层逻辑在 crates/ldap/src/password.rs 与 crates/ldap/src/handler.rs 的do_bind中实现绑定成功后后续搜索请求会使用该账号的权限范围get_user_restricted_lister_handler。AUTH_LDAP_USER_SEARCH_BASE_DNoupeople,DCexample,DCcomTandoor 在这个子树下搜索用户。LLDAP 的搜索实现crates/ldap/src/search.rs要求搜索子树位于 Base DN 之下oupeople正是 LLDAP 存放用户的标准分支。可选环境变量精确控制“谁能登录”与“字段映射”通过memberOf过滤只放行指定组成员默认情况下Tandoor 会认证搜索 Base DN 下的所有用户。如果只想让部分用户登录 Tandoor可以按原文档给出的方式把用户收拢进一个tandoor_users组然后用过滤器约束AUTH_LDAP_USER_SEARCH_FILTER_STR(((objectclassperson)(memberOfcntandoor_users,ougroups,dcexample,dccom))(uid%(user)s))该过滤器由三层条件构成objectclasspersonLLDAP 的默认用户对象类包含inetOrgPerson、posixAccount、mailAccount、person见 crates/ldap/src/core/user.rs 的DEFAULT_USER_OBJECT_CLASSES因此所有 LLDAP 用户都满足此条件。memberOfcntandoor_users,ougroups,dcexample,dccom这是关键的准入控制。LLDAP 原生支持memberOf属性与过滤在 crates/ldap/src/core/utils.rs 的map_user_field中memberof与ismemberof都会被映射为MemberOf字段类型在 crates/ldap/src/core/user.rs 的过滤转换中MemberOf会被解析为UserRequestFilter::MemberOf(group)按组归属过滤用户。同时用户搜索结果的memberOf属性值也会被展开为cn组名,ougroups,base_dn见get_user_attribute中的MemberOf分支。uid%(user)s%(user)s是 Tandoor 的登录名占位符。LLDAP 将uid映射到主键user_id见 crates/ldap/src/core/utils.rs 的map_user_fielduid | user_id | id因此这里匹配的是用户在 LLDAP 中的用户名。需要留意仓库测试表明 LLDAP 对组列表型属性的“相等性过滤”有明确限制crates/ldap/src/core/user.rs 中的mailalias测试用例会返回 “Equality filter on list attribute is not supported”但memberOf走的是专门的分支而非普通列表属性因此上述组过滤可以正常工作。实践建议是在 Tandoor 的tandoor_users组过滤之外同时在 LLDAP 侧把该组用户权限保持为普通只读。字段映射Tandoor 用户字段 ← LLDAP 属性AUTH_LDAP_USER_ATTR_MAP{first_name: givenName, last_name: sn, email: mail}这行映射把 Tandoor 的first_name、last_name、email分别对应到 LLDAP 的givenName、sn、mail。在 LLDAP 侧这些属性名都有明确对应关系crates/ldap/src/core/utils.rs 的map_user_fieldgivenName或first_name/firstname→ 用户属性first_namesn或last_name/lastname→ 用户属性last_namemail或email→ 用户主键邮箱mail。也就是说LLDAP 用户资料页上的“First name / Last name / Email”正是 Tandoor 需要的数据来源。值得注意的是LLDAP 的mail是内置主键属性REQUIRED_USER_ATTRIBUTES包含user_id与mail而givenName/sn映射到的是自定义属性槽位若个别用户没有填写搜索应答中对应属性可能为空Tandoor 端会得到空值可按需在 LLDAP 用户资料中补齐。登录时更新字段与缓存超时AUTH_LDAP_ALWAYS_UPDATE_USER1 AUTH_LDAP_CACHE_TIMEOUT3600AUTH_LDAP_ALWAYS_UPDATE_USER1每次登录都从 LDAP 拉取用户字段并覆盖 Tandoor 本地记录保证在 LLDAP 侧改名、改邮箱后 Tandoor 自动同步。AUTH_LDAP_CACHE_TIMEOUT3600LDAP 查询结果在 Tandoor 内的缓存秒数3600 即 1 小时。值越大对 LLDAP 压力越小但字段变更生效越慢与ALWAYS_UPDATE_USER配合时建议根据你修改用户资料的频率调整。可选启用 TLSLDAPS / STARTTLS如果 LLDAP 与 Tandoor 不在同一个受信任的内网例如跨主机、走公网应启用加密AUTH_LDAP_START_TLS1 AUTH_LDAP_TLS_CACERTFILE/etc/ssl/certs/own-ca.pemAUTH_LDAP_START_TLS1对 LDAP 连接启用 STARTTLS 升级。AUTH_LDAP_TLS_CACERTFILE/etc/ssl/certs/own-ca.pem指定 CA 证书路径用于校验 LLDAP 的证书。LLDAP 侧的对应能力是LDAPSLDAP over TLS与 STARTTLS 不同在 lldap_config.docker_template.toml 的[ldaps_options]中可启用enabledtrue、指定监听端口默认6360、cert_file与key_file。如果你给 LLDAP 配置的是 LDAPS 端口如ldaps://lldap:6360则 Tandoor 的AUTH_LDAP_SERVER_URI应改为ldaps://前缀同时 LLDAP 容器内需要挂载证书与密钥文件并把自定义 CA 信任链提供给 Tandoor 容器AUTH_LDAP_TLS_CACERTFILE指向的正是该 CA 证书。如果两者在同一个 Docker 内网且无敏感流量可以保持明文ldap://但生产环境仍建议按此节加固。端到端调用链登录时发生了什么把上面的配置串起来一次 Tandoor 用户登录在 LLDAP 侧经历如下流程与 crates/ldap/src/handler.rs、crates/ldap/src/password.rs、crates/ldap/src/search.rs 的代码路径对应Tandoor 用AUTH_LDAP_BIND_DN/AUTH_LDAP_BIND_PASSWORD发起Bind。LLDAP 的do_bind校验密码后把会话标记为已绑定用户并读取该用户的权限get_permissions_for_user后续搜索都在该权限范围内执行crates/ldap/src/handler.rs 的do_bind。Tandoor 以AUTH_LDAP_USER_SEARCH_BASE_DN为根带上AUTH_LDAP_USER_SEARCH_FILTER_STR发起Search。LLDAP 将过滤器逐层解析uid走UserId等值匹配memberOf走组归属匹配objectclassperson匹配默认用户对象类crates/ldap/src/core/user.rs 的convert_user_filter。命中用户后LLDAP 按请求属性返回条目givenName、sn、mail、memberOf等字段按 crates/ldap/src/core/user.rs 的get_user_attribute展开Tandoor 依据AUTH_LDAP_USER_ATTR_MAP完成字段映射并建立本地用户记录。若启用了AUTH_LDAP_ALWAYS_UPDATE_USER后续每次登录都会重复步骤 23 刷新字段受AUTH_LDAP_CACHE_TIMEOUT控制的缓存则减少不必要的重复查询。这一流程与仓库测试覆盖的行为一致例如 crates/ldap/src/core/user.rs 的搜索测试断言了mail、givenName、memberOf等属性的返回内容以及memberOf等值过滤的解析结果可作为你排错时的对照参考。常见排错清单登录提示“无效凭据”优先检查AUTH_LDAP_BIND_DN的用户是否存在于 LLDAP、密码是否正确、该用户是否在lldap_strict_readonly组内绑定账号权限不足会导致搜索被拒LLDAP 会返回InsufficentAccessRights对应 crates/ldap/src/handler.rs 中“No user currently bound”之类的错误路径。能认证但拿不到用户属性检查AUTH_LDAP_USER_ATTR_MAP的键值是否与 LLDAP 实际属性一致LLDAP 对未知属性会打印 warning提示加入ignored_user_attributes见 lldap_config.docker_template.toml 与 crates/ldap/src/core/user.rs打开 LLDAP 的verbosetrue日志即可看到。过滤条件不生效确认组名与ougroups,dcexample,dccom路径拼写无误memberOf值是 LLDAP 生成的cn组名,ougroups,base_dn格式任何大小写或空格差异都会导致匹配失败。TLS 报错确认AUTH_LDAP_TLS_CACERTFILE指向的 CA 与 LLDAP 的[ldaps_options]证书同源且 Tandoor 容器内能读到该文件若使用 LDAPS 端口记得同时把AUTH_LDAP_SERVER_URI前缀改为ldaps://。完成以上配置后Tandoor 即可通过 LLDAP 实现集中的用户认证与资料同步后续新增用户只需在 LLDAP 侧创建并加入tandoor_users组无需再在 Tandoor 中单独开户。赞分享后端认证鉴权【免费下载链接】lldapLight LDAP implementation项目地址https://gitcode.com/gh_mirrors/ll/lldap点击查看免费下载相关推荐使用 LLDAP 为 SonarQube 配置 LDAP 认证docker-compose 环境变量完整指南使用 LLDAP 为 SonarQube 配置 LDAP 认证docker compose 环境变量完整指南 LLDAP 是一个轻量级、以认证为核心目标的 L后端认证鉴权使用 LLDAP 作为 Hedgedoc 的 LDAP 认证后端Docker 环境变量配置实战使用 LLDAP 作为 Hedgedoc 的 LDAP 认证后端Docker 环境变量配置实战 本文以 LLDAP 仓库中的 Hedgedoc 集成示例 ht后端认证鉴权使用 lldap 作为 Continuwuity 的 LDAP 认证后端环境变量配置与基于 memberOf 的登录/管理员分组实战使用 lldap 作为 Continuwuity 的 LDAP 认证后端环境变量配置与基于 memberOf 的登录/管理员分组实战 本篇技术指南围绕 exa后端认证鉴权上一篇Axure RP汉化完整指南axure-cn语言包安装与排障速成下一篇把 3 小时的重复操作压到 5 分钟Illustrator 自动化脚本使用实录创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考