Apache Superset集成LDAP后本地登录失效及AUTH_ROLES_MAPPING配置问题
启用LDAP后本地admin账号无法登录的核心原因
本地用户登录失败的问题,本质是Superset底层依赖的Flask AppBuilder安全框架的认证机制规则导致的:
AUTH_TYPE参数是单值枚举,不支持位掩码拼接、多值同时赋值的写法。框架内置的枚举固定值为:AUTH_DB=1、AUTH_LDAP=2、AUTH_OID=3、AUTH_REMOTE_USER=4,你之前尝试的AUTH_TYPE = 1|2、同时写AUTH_TYPE = AUTH_DB, AUTH_LDAP的写法,框架根本无法解析,要么触发参数错误回退到默认认证逻辑,要么直接走单值识别到的分支,完全达不到双认证源并行校验的效果。- 当你全局配置
AUTH_TYPE = AUTH_LDAP时,框架的登录校验逻辑会完全跳过本地数据库的用户表查询,所有登录请求都强制走LDAP服务校验流程。哪怕本地admin账号的密码设置完全正确,框架也不会去比对本地存储的凭证,自然会返回登录失败。 - 你的配置里存在拼写错误:把
AUTH_LDAP_GROUP_FIELD写成了AUTH_LDAP_GROUP_FIELS,不过这个错误只会影响组角色匹配,不会导致本地用户完全无法登录。
AUTH_ROLES_MAPPING 不生效的正确配置方法
这个配置不生效基本都是漏了前置依赖项,按照下面的配置顺序补全就能正常工作:
- 首先必须满足3个前置条件:
- 开启
AUTH_USER_REGISTRATION = True,允许LDAP验证通过的用户自动在Superset本地用户表创建条目,没有这个条目就没有存储角色映射的载体 - 修正LDAP组字段的拼写错误:正确的配置项是
AUTH_LDAP_GROUP_FIELD,值要填LDAP目录里存储用户组关联的属性名,Active Directory环境下一般是memberOf,不是直接填用户组的DN - 开启登录时角色同步:设置
AUTH_ROLES_SYNC_AT_LOGIN = True,不然角色映射只会在用户首次注册时生效,后续用户在LDAP里的组变动不会同步到Superset
- 开启
- 完整可运行的参考配置如下:
# 导入内置的认证类型枚举 from flask_appbuilder.security.manager import AUTH_LDAP # 全局认证类型设为LDAP AUTH_TYPE = AUTH_LDAP # 允许LDAP用户自动注册 AUTH_USER_REGISTRATION = True # 无匹配组时给用户的默认基础角色 AUTH_USER_REGISTRATION_ROLE = "Public" # 开启登录时同步LDAP组对应的角色 AUTH_ROLES_SYNC_AT_LOGIN = True # LDAP服务基础连接配置 AUTH_LDAP_SERVER = "ldap://10.10.0.50" AUTH_LDAP_USE_TLS = False AUTH_LDAP_BIND_USER = "CN=Administrator,CN=Users,DC=gru,DC=lab" AUTH_LDAP_BIND_PASSWORD = "your_bind_password_here" # 用户查询的根路径 AUTH_LDAP_SEARCH = "DC=gru,DC=lab" # LDAP里对应用户登录名的字段 AUTH_LDAP_UID_FIELD = "sAMAccountName" AUTH_LDAP_FIRSTNAME_FIELD = "givenName" AUTH_LDAP_LASTNAME_FIELD = "sn" # 修正拼写错误:填用户组关联的属性名,AD环境一般是memberOf AUTH_LDAP_GROUP_FIELD = "memberOf" # 角色映射规则:Key是LDAP组的完整DN,Value是要分配的Superset内置/自定义角色列表 AUTH_ROLES_MAPPING = { "CN=linuxadmins,DC=gru,DC=lab": ["Admin"], "CN=bi_data_viewers,DC=gru,DC=lab": ["Gamma"] }
- 剩余常见不生效的排查点:
- 映射规则里的LDAP组DN必须和LDAP目录实际查询返回的字符串完全一致,大小写、空格、特殊字符只要有差异就会匹配失败
- 已经存在的历史用户,因为之前没开启角色同步,就算配置写对了,也要重新登录一次才会拉取最新的组信息匹配角色
同时支持本地admin、LDAP用户登录的实现方案
Flask AppBuilder从3.0版本开始就没有内置多认证源并行的逻辑,全局设AUTH_LDAP就会完全绕过本地用户校验,要实现双路登录只有两种靠谱的方式:
- 方案一:自定义安全管理器,重写用户校验逻辑,优先比对本地数据库存储的admin账号凭证,校验不通过再走LDAP流程。这种方式不需要改动LDAP侧的配置,能保留本地账号的独立兜底能力
- 方案二:把本地admin账号的凭证同步到LDAP目录中,直接用LDAP的账号体系管理所有用户,不需要修改框架的认证逻辑
内容的提问来源于stack exchange,提问作者grU
相关产品推荐
相关产品推荐

