ldap+flask+python2实现统一认证里面的那些编码神坑

Posted 落叶虽美只活一世

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ldap+flask+python2实现统一认证里面的那些编码神坑相关的知识,希望对你有一定的参考价值。

       首先想吐槽下,直接接手别人的项目,而且是经过四五个人手的项目,是怎么个痛苦。两三套代码django、flask、tornado应有尽有,代码里,掰开手指头就可数的全英文注释,几台服务器没交接清楚,所有的都是问了才说,正常应该一起工作一段时间,然并卵,交接完就不搭理。前半个月看代码,揣摩别人心思,凉凉~

       这两天死磕一个问题,项目背景是实现一个账号密码登陆多个系统,有个同事改密码后其他系统都可以登陆,只有一个系统一直登不上。密码带中文标点符号,一顿改密码测试,果然有的中文标点符号过不了。但不是所有中文标点符号,部分特殊字符也过不了。迎合前端,服务器二次验证,用黑名单和白名单卡,正则如下:

# 正则判断中文字符
#pattern = u"[\\uff1f\\uff01\\uff0c\\u0026\\uff1b\\uff1a\\uff08\\uff09\\u3008\\u3009\\u300e\\u300f\\u300c\\u300d\\ufe43\\ufe44\\u3014\\u3015\\u2026\\uff5e\\ufe4f\\uffe5><]+"

# 验证密码8-16位数字、大小写字母、半角字符3种组合
pattern = """^(?:(?=.*[0-9].*)(?=.*[A-Za-z].*)(?=.*[,\\.#%\'\\+\\*\\-:;^_`&|"@=~{}\\[\\]\\(\\)\\$<>\\?/!].*))[,\\.#%\'\\+\\*\\-:;^_`&|"@=~{}\\[\\]\\(\\)\\$<>\\?/!0-9A-Za-z]{8,16}$"""

显然这种只能让用户重新改密码,体验不太好。
换种思路,为什么改完密码其他系统都可以通过,只有一个不过,那就兼容那个系统。涉及中文大半概率与编码有关,使用python的朋友应该被编码坑过。
排查改密码经过的地方有3处:

  1.改密码
def modify_password(conn, email, new_password, old_password=None):
    if old_password is None and conn is None:
        conn = bind_ad(ADMIN, ADMINPD)
    conn.search(DC, \'(&(objectclass=person)(mail={email}))\'.format(email=email))
    if not conn.entries:
        return \'\'
    user = conn.entries[0]
    print(\'user\',user)
    dn = user.entry_dn
    if SUPERVISOR:
        # dn = user.entry_dn.encode(\'raw_unicode_escape\')
        # 此处改为utf-8
        dn = user.entry_dn.decode(\'utf-8\')
    re = conn.extend.microsoft.modify_password(dn, new_password, old_password)
    return re


  2.检验老密码有没有绑定ldap
# 知道原密码改密码时会检测旧密码是否绑定ldap
old_password = passwd_reqparse.parse_args().oldpassword
#conn = bind_ad(email, old_password)
# 此处改为utf-8
conn = bind_ad(email, old_password.encode(\'utf-8\'))


  3.认证时
#文件行首添加
import sys
reload(sys)
sys.setdefaultencoding(\'utf8\')
# 默认ascii码,改为utf8
def parse_para(json_data):
    """解析用户输入的账号密码"""
    password = json_data.get(\'password\')
    password_utf8 = password.encode(\'utf-8\')
    # return转码后的密码
    return response_json, businessname, email, password_utf8, namepw, method

 

推荐个好用的工具查看ldap信息:LDAPBrowser


       Unicode转换工具:http://tool.chinaz.com/tools/unicode.aspx

       

以上是关于ldap+flask+python2实现统一认证里面的那些编码神坑的主要内容,如果未能解决你的问题,请参考以下文章

ldap统一认证架构方案及实现指南

LDAP简述及统一认证说明

LDAP简述及统一认证说明

集成OpenLDAP与Kerberos实现统一认证:基于SSSD同步LDAP账号

集成OpenLDAP与Kerberos实现统一认证:基于SSSD同步LDAP账号

Deepin系统基于LDAP统一认证