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

       


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM