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


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

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

    # 正则判断中文字符
    #pattern = u"[uff1fuff01uff0cu0026uff1buff1auff08uff09u3008u3009u300eu300fu300cu300dufe43ufe44u3014u3015u2026uff5eufe4fuffe5><]+"
    
    # 验证密码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

           

    实践出真知~
  • 相关阅读:
    jstat命令-帮助优化java性能
    使用nginx搭建简单文件服务器
    JVM初探
    fastDFS shiro权限校验 redis FreeMark页面静态化
    spring AOP
    Java多线程并发
    js插件之Ocupload
    Jquery总结
    shell
    Linux(二)
  • 原文地址:https://www.cnblogs.com/NolaLi/p/9456571.html
Copyright © 2020-2023  润新知