Flagsmith LDAP 集成实战:通过 django-python3-ldap 接入 OpenLDAP 与 Microsoft Active Directory

发布时间:2026/10/8 1:38:58
Flagsmith LDAP 集成实战:通过 django-python3-ldap 接入 OpenLDAP 与 Microsoft Active Directory 后端前端【免费下载链接】flagsmithFlagsmith is an open-source feature flag platform with remote config, experimentation, and self-hosted or cloud deployment options.项目地址https://gitcode.com/gh_mirrors/fl/flagsmith点击查看免费下载本篇技术指南围绕 Flagsmith 自托管部署中的LDAP 认证与目录同步展开Flagsmith 通过环境变量接入django_python3_ldap以用户名 密码方式向 LDAP 服务器完成认证并自动在 Django 数据库中创建/更新用户。读完本文你将掌握 Flagsmith LDAP 的整体认证链路、OpenLDAP 与 Microsoft Active Directory 的完整接入配置、LDAP 用户与组到 Flagsmith 的一键同步命令以及全部后端环境变量的含义与默认值。:::tip LDAP 认证属于 Flagsmith 自托管 [Enterprise 订阅]文档原文指向 https://flagsmith.com/pricing本文从仓库证据出发仅提示该能力随flagsmith-api-ee/flagsmith-private-cloud镜像提供的一部分需要先在 企业版部署文档 中确认你的部署形态。 :::LDAP 认证的整体工作流程Flagsmith 本身不直接实现 LDAP 协议而是复用 Django 社区的django-python3-ldap库并以可插拔的认证后端方式接入。整个认证流程可以概括为三步绑定认证用户提交 username / password 后Flagsmith 将LDAP_AUTH_FORMAT_USERNAME格式化后的用户名与密码绑定bind到 LDAP 服务器由 LDAP 服务器完成密码校验拉取用户属性认证成功后Flagsmith 依据LDAP_AUTH_USER_FIELDS映射从 LDAP 目录中读取uid、mail、givenName、sn等属性落库建档Flagsmith 在 Django 数据库中创建或更新对应用户记录并使用LDAP_AUTH_SYNC_USER_RELATIONS回调同步额外的用户关系如组织与组成员关系。从源码结构看这一开关在 api/app/settings/common.py 中通过LDAP_ENABLED LDAP_INSTALLED and LDAP_AUTH_URL决定只有当前运行环境中安装了flagsmith_ldap模块importlib.util.find_spec探测该模块位于闭源的 Enterprise 包中并且显式设置了LDAP_AUTH_URLLDAP 才会被激活。激活后Django 的AUTHENTICATION_BACKENDS列表头部会被插入django_python3_ldap.auth.LDAPBackendflagsmith_ldap也会被追加进INSTALLED_APPS。这意味着未设置LDAP_AUTH_URL时LDAP 代码路径完全不会被启用普通密码认证不受影响LDAPBackend位于认证后端列表首位LDAP 会成为优先尝试的认证方式。在测试环境中api/app/settings/test.py当LDAP_INSTALLED为真时同样会追加flagsmith_ldap应用并将LDAP_DEFAULT_FLAGSMITH_ORGANISATION_ID置为None说明 LDAP 逻辑在 CI 中是可测试的。仓库的 api/Makefile 也表明 LDAP 集成测试tests/ldap_integration_tests源码位于 Enterprise 私有仓库flagsmith-private/integration_tests/flagsmith_ldap会在构建私有版测试镜像时被拉取进来从测试工程侧面印证了 LDAP 是 Enterprise 特性。接入 Microsoft Active Directory 的三种用户名格式默认情况下Flagsmith 开箱即支持OpenLDAP用户名格式化函数默认是django_python3_ldap.utils.format_username_openldap。要连接微软 Active DirectoryAD需要按 AD 服务器上实际使用的用户名格式调整LDAP_AUTH_FORMAT_USERNAME与LDAP_AUTH_ACTIVE_DIRECTORY_DOMAIN两个环境变量。1. 简单用户名例如usernameLDAP_AUTH_FORMAT_USERNAMEdjango_python3_ldap.utils.format_username_active_directory无需设置域名直接以用户输入的字符串作为 sAMAccountName 绑定。2. 下行登录名Down-level login name例如DOMAIN\usernameLDAP_AUTH_FORMAT_USERNAMEdjango_python3_ldap.utils.format_username_active_directory LDAP_AUTH_ACTIVE_DIRECTORY_DOMAINDOMAIN此时用户需以DOMAIN\username形式登录格式化函数会把输入拼接为 AD 约定的下行登录名。3. 用户主体名User-principal-name例如userdomain.comLDAP_AUTH_FORMAT_USERNAMEdjango_python3_ldap.utils.format_username_active_directory_principal LDAP_AUTH_ACTIVE_DIRECTORY_DOMAINdomain.com用户以userdomain.com形式登录格式化函数将其转换为 UPN 格式。注意此模式下LDAP_AUTH_ACTIVE_DIRECTORY_DOMAIN要填邮箱后缀域名如domain.com而不是 NetBIOS 域名。4. 针对 AD 服务器习惯的附加调优部分 AD 服务器的目录结构/对象类型与 OpenLDAP 默认值不同可以按需覆盖默认映射与对象类LDAP_AUTH_USER_FIELDSusernamesAMAccountName,emailmail,first_namegivenName,last_namesn LDAP_AUTH_OBJECT_CLASSuserLDAP_AUTH_USER_FIELDS把 AD 的sAMAccountName映射到 Flagsmith 用户的username字段OpenLDAP 场景下默认是uidLDAP_AUTH_OBJECT_CLASS指定 AD 中表示用户对象的类userOpenLDAP 场景下默认是inetOrgPerson。这两项是否必须修改取决于你的 AD 服务器配置若与默认值相符可不设置。同步 LDAP 用户与组到 FlagsmithFlagsmith 提供管理命令sync_ldap_users_and_groups用于把 DirectoryLDAP/AD中的用户与组结构批量同步到 Flagsmithpython manage.py sync_ldap_users_and_groups从源码注释api/app/settings/common.py可以看出该命令依赖LDAP_SYNC_USER_USERNAME与LDAP_SYNC_USER_PASSWORD两个凭据变量以专用账号连接 LDAP 服务器。运行该命令将产生以下效果移除用户Directory 中被删除的用户会从 Flagsmith 中移除移除组Directory 中被删除的组会从 Flagsmith 中移除移除组成员关系用户不再属于 Directory 中某个组时其在 Flagsmith 中的对应组成员关系会被解除新增组成员关系用户属于 Directory 中的新组时会将该用户加入 Flagsmith 对应的组。:::note 执行同步命令前务必先设置以下环境变量LDAP_SYNC_USER_USERNAMELDAP_SYNC_USER_PASSWORDLDAP_SYNCED_GROUPSLDAP_AUTH_SYNC_USER_RELATIONSLDAP_DEFAULT_FLAGSMITH_ORGANISATION_ID其中LDAP_SYNCED_GROUPS决定哪些 LDAP 组会被同步进 FlagsmithLDAP_AUTH_SYNC_USER_RELATIONS需设置为flagsmith_ldap.ldap.sync_user_groups才能实现组关系同步LDAP_DEFAULT_FLAGSMITH_ORGANISATION_ID决定新建用户归属哪个 Flagsmith 组织。 :::后端环境变量参考表不同镜像flagsmith/flagsmith-api-ee与flagsmith/flagsmith-private-cloud之间各变量含义与默认值一致请根据实际使用的镜像选择对应的配置段落。以下两表内容等价仅镜像适用性不同。flagsmith-api-ee镜像变量示例值说明默认值LDAP_AUTH_URLldap://localhost:389LDAP 服务器 URLNoneLDAP_AUTH_USE_TLSFalse设为True时连接会启用 TLSFalseLDAP_AUTH_SEARCH_BASEoupeople,dcexample,dccom查找用户的 LDAP 搜索基准search baseoupeople,dcexample,dccomLDAP_AUTH_OBJECT_CLASSinetOrgPerson代表用户的 LDAP 对象类inetOrgPersonLDAP_AUTH_USER_FIELDSusernameuid,emailemailFlagsmith 用户模型字段到 LDAP 属性的映射usernameuid,emailemail,first_namegivenName,last_namesnLDAP_AUTH_ACTIVE_DIRECTORY_DOMAINDOMAIN为 Active Directory 用户设置登录域NoneLDAP_AUTH_CONNECT_TIMEOUT60对底层ldap3库设置连接超时秒NoneLDAP_AUTH_RECEIVE_TIMEOUT60对底层ldap3库设置接收超时秒NoneLDAP_AUTH_FORMAT_USERNAMEdjango_python3_ldap.utils.format_username_openldap用于格式化绑定用户名的可调用对象路径django_python3_ldap.utils.format_username_openldapLDAP_DEFAULT_FLAGSMITH_ORGANISATION_ID1所有新建用户都会被加入该组织NoneLDAP_AUTH_SYNC_USER_RELATIONSflagsmith_ldap.ldap.sync_user_groups用于同步用户关系的可调用对象路径若设为flagsmith_ldap.ldap.sync_user_groups必须同时设置LDAP_DEFAULT_FLAGSMITH_ORGANISATION_IDdjango_python3_ldap.utils.sync_user_relationsLDAP_AUTH_FORMAT_SEARCH_FILTERSflagsmith_ldap.ldap.login_group_search_filter用于为登录增加搜索过滤条件、限制登录用户组的可调用对象路径django_python3_ldap.utils.format_search_filtersLDAP_SYNCED_GROUPSCNReaders,CNRoles,CNwebapp01,dcadmin,dccom:CNMarvel,CNRoles,CNwebapp01,dcadmin,dccom以冒号:分隔的 LDAP 组 DN 列表会被惰性复制到 Flagsmith即用户登录时若属于其中某个组则创建该组并把当前用户加入。注意需将LDAP_AUTH_SYNC_USER_RELATIONS设为flagsmith_ldap.ldap.sync_user_groups[]LDAP_LOGIN_GROUPCNReaders,CNRoles,CNwebapp01,dcadmin,dccom允许登录的用户组 DN若为None则不做组限制。注意需将LDAP_AUTH_FORMAT_SEARCH_FILTERS设为flagsmith_ldap.ldap.login_group_search_filterNoneLDAP_SYNC_USER_USERNAMEjohnsync_ldap_users_and_groups命令连接服务器使用的用户名NoneLDAP_SYNC_USER_PASSWORDpasswordsync_ldap_users_and_groups命令连接服务器使用的密码Noneflagsmith-private-cloud镜像变量示例值说明默认值LDAP_AUTH_URLldap://localhost:389LDAP 服务器 URLNoneLDAP_AUTH_USE_TLSFalse设为True时连接会启用 TLSFalseLDAP_AUTH_SEARCH_BASEoupeople,dcexample,dccom查找用户的 LDAP 搜索基准oupeople,dcexample,dccomLDAP_AUTH_OBJECT_CLASSinetOrgPerson代表用户的 LDAP 对象类inetOrgPersonLDAP_AUTH_USER_FIELDSusernameuid,emailemailFlagsmith 用户模型字段到 LDAP 属性的映射usernameuid,emailemail,first_namegivenName,last_namesnLDAP_AUTH_ACTIVE_DIRECTORY_DOMAINDOMAIN为 Active Directory 用户设置登录域NoneLDAP_AUTH_CONNECT_TIMEOUT60对底层ldap3库设置连接超时秒NoneLDAP_AUTH_RECEIVE_TIMEOUT60对底层ldap3库设置接收超时秒NoneLDAP_AUTH_FORMAT_USERNAMEdjango_python3_ldap.utils.format_username_openldap用于格式化绑定用户名的可调用对象路径django_python3_ldap.utils.format_username_openldapLDAP_DEFAULT_FLAGSMITH_ORGANISATION_ID1所有新建用户都会被加入该组织NoneLDAP_AUTH_SYNC_USER_RELATIONSflagsmith_ldap.ldap.sync_user_groups用于同步用户关系的可调用对象路径若设为flagsmith_ldap.ldap.sync_user_groups必须同时设置LDAP_DEFAULT_FLAGSMITH_ORGANISATION_IDdjango_python3_ldap.utils.sync_user_relationsLDAP_AUTH_FORMAT_SEARCH_FILTERSflagsmith_ldap.ldap.login_group_search_filter用于为登录增加搜索过滤条件、限制登录用户组的可调用对象路径django_python3_ldap.utils.format_search_filtersLDAP_SYNCED_GROUPSCNReaders,CNRoles,CNwebapp01,dcadmin,dccom:CNMarvel,CNRoles,CNwebapp01,dcadmin,dccom以冒号:分隔的 LDAP 组 DN 列表会被惰性复制到 Flagsmith。注意需将LDAP_AUTH_SYNC_USER_RELATIONS设为flagsmith_ldap.ldap.sync_user_groups[]LDAP_LOGIN_GROUPCNReaders,CNRoles,CNwebapp01,dcadmin,dccom允许登录的用户组 DN若为None则不做组限制。注意需将LDAP_AUTH_FORMAT_SEARCH_FILTERS设为flagsmith_ldap.ldap.login_group_search_filterNoneLDAP_SYNC_USER_USERNAMEjohnsync_ldap_users_and_groups命令连接服务器使用的用户名NoneLDAP_SYNC_USER_PASSWORDpasswordsync_ldap_users_and_groups命令连接服务器使用的密码None环境变量的源码级解读在 api/app/settings/common.py 中可以找到上述全部变量的解析逻辑几个关键细节值得注意启用开关LDAP_ENABLED LDAP_INSTALLED and LDAP_AUTH_URL。两者缺一不可既要在 Python 环境中存在flagsmith_ldap包Enterprise 专属又必须显式给出 LDAP 服务器地址只有同时满足LDAPBackend才会被插入认证后端并注册flagsmith_ldap应用字段映射格式LDAP_AUTH_USER_FIELDS使用env.dict解析即Flagsmith字段LDAP属性的逗号分隔键值对默认完整映射为usernameuid, first_namegivenName, last_namesn, emailmail顺序与文档表格展示一致列表类变量LDAP_SYNCED_GROUPS使用env.list解析分隔符为:delimiter:因此示例中多个组 DN 用冒号串联是解析协议的一部分不可混用逗号超时控制LDAP_AUTH_CONNECT_TIMEOUT与LDAP_AUTH_RECEIVE_TIMEOUT均通过env.int读取单位是秒最终透传给ldap3库用于网络连接的底层控制回调路径LDAP_AUTH_FORMAT_USERNAME、LDAP_AUTH_SYNC_USER_RELATIONS、LDAP_AUTH_FORMAT_SEARCH_FILTERS均为“可调用对象点分路径”字符串其中flagsmith_ldap.ldap.sync_user_groups与flagsmith_ldap.ldap.login_group_search_filter来自 Enterprise 的flagsmith_ldap包用于实现组关系同步与登录组限制这也是文档中多次提醒“请将LDAP_AUTH_SYNC_USER_RELATIONS设为flagsmith_ldap.ldap.sync_user_groups”的原因。典型接入步骤小结以一个典型的自托管 Enterprise 部署为例接入 LDAP 的最小步骤为在运行flagsmith-api-ee或flagsmith-private-cloud容器的环境中设置LDAP_AUTH_URL如ldap://ldap.example.com:389使LDAP_ENABLED为真按你的目录服务类型配置LDAP_AUTH_SEARCH_BASE、LDAP_AUTH_OBJECT_CLASS、LDAP_AUTH_USER_FIELDS若为 AD再按上文三种格式之一配置LDAP_AUTH_FORMAT_USERNAME必要时配合LDAP_AUTH_ACTIVE_DIRECTORY_DOMAIN若需要把 LDAP 组同步进 Flagsmith设置LDAP_SYNCED_GROUPS、LDAP_AUTH_SYNC_USER_RELATIONSflagsmith_ldap.ldap.sync_user_groups与LDAP_DEFAULT_FLAGSMITH_ORGANISATION_ID若需限制仅特定组可登录设置LDAP_LOGIN_GROUP与LDAP_AUTH_FORMAT_SEARCH_FILTERSflagsmith_ldap.ldap.login_group_search_filter重启 API 服务后用户即可用 LDAP 凭据登录需要批量对齐目录结构时在 API 容器内执行python manage.py sync_ldap_users_and_groups执行前确认LDAP_SYNC_USER_USERNAME、LDAP_SYNC_USER_PASSWORD等同步所需变量已就绪避免因缺少凭据导致同步失败。相关资源LDAP 功能的全部环境变量解析与认证后端注册api/app/settings/common.pyLDAP 测试环境适配api/app/settings/test.pyLDAP 在访问控制体系中的位置访问控制文档索引LDAP 相关环境变量的全局部署参考环境变量部署文档Enterprise 部署前提企业版部署文档赞分享后端前端【免费下载链接】flagsmithFlagsmith is an open-source feature flag platform with remote config, experimentation, and self-hosted or cloud deployment options.项目地址https://gitcode.com/gh_mirrors/fl/flagsmith点击查看免费下载相关推荐Phoenix LDAP 认证完全指南从 LDAP 协议基础到 Active Directory / OpenLDAP 集成实战Phoenix LDAP 认证完全指南从 LDAP 协议基础到 Active Directory / OpenLDAP 集成实战 面向熟悉 OAuth2/OI可观测性AI 评测LLMOpsAI 应用人工智能Apereo CAS 基于 LDAP 目录Active Directory / OpenLDAP的认证集成与配置指南Apereo CAS 基于 LDAP 目录Active Directory / OpenLDAP的认证集成与配置指南 CAS 将 LDAP 目录如 Act后端认证鉴权单点登录Phoenix LDAP 认证深度指南Active Directory/OpenLDAP 集成、Grafana 兼容配置与安全加固实践Phoenix LDAP 认证深度指南Active Directory/OpenLDAP 集成、Grafana 兼容配置与安全加固实践 本文以 Phoenix可观测性AI 评测LLMOpsAI 应用人工智能上一篇FlexSearch 结合 PostgreSQL 的持久化索引实战安装、挂载、配置与底层实现解析下一篇终极指南如何用CS-Xmind-Note与Anki打造高效408记忆系统创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考