CDH6.0.1自带的HUE版本是4.2。
HUE4.2和HUE4.3在使用LdapBackend时有个bug,会导致任意的LDAP用户登录,都是超级管理员。
在HUE4.4版本修复了这个bug。
https://issues.cloudera.org/browse/HUE-8675
https://review.cloudera.org/r/13556/
HUE4.2的原始代码(左屏部分)
https://github.com/cloudera/hue/blob/cdh6.0.1-release/desktop/core/src/desktop/auth/backend.py
有bug的代码,在cdh6.0.1-release/desktop/core/src/desktop/auth/backend.py的第470行。
HUE4.4的修复代码(右屏部分)
https://github.com/cloudera/hue/commit/5fa75c3176b2065709021284803aa61e9e72f0a5#
修复方法
将第470行的
profile.creation_method = UserProfile.CreationMethod.EXTERNAL
修改为
profile.creation_method = UserProfile.CreationMethod.EXTERNAL.name
重启HUE即可。
源码分析
第446行,会去检测useradmin_userprofile表中creation_method字段有没有EXTERNAL的值,如果没有的话,会使得标志位is_super变成True,即认为该用户是第一个外部用户,使该用户成为超级管理员。
第470行,也就是有bug的这一行,把登录用户(新用户or老用户)的creation_method字段值改成了CreationMethod.EXTERNAL,这样就会导致useradmin_userprofile表中永远不会有creation_method字段值为EXTERNAL的记录,那么以后所有的外部用户,都会被误认为是第一个外部用户,导致标志位is_super设为True,成了超级管理员。
结合数据库分析
在没修改源码之前,在LDAP上创建了test_user1和test_user2,这两个用户登录后,都变成了超级管理员,且creation_method为CreationMethod.EXTERNAL
修改源码修复后,在LDAP上创建了test_user3和test_user4。在test_user3登录时,因为useradmin_userprofile表中还没有EXTERNAL的值,所以会被当成第一个外部用户,被设置成超级管理员,且creation_method会被设置为EXTERNAL。在test_user4登录时,因为已经useradmin_userprofile表中已经有了EXTERNAL的值,所以test_user4的is_super为默认值False,就是一个普通用户了。在后面hive用户登录,根据代码的第470行和473行,他的creation_method值会被更新成新的值,跟代码的逻辑完全符合。
其他几种Backend也有这个问题,比如pam, spnego, oauth, openid, saml等,因为我没用到所以就暂时不修复了。有需要的可以自助修改。
欢迎关注我的公众号“九万里大数据”,原创技术文章第一时间推送。