1. 程式人生 > >ldap+flask+python2實現統一認證裏面的那些編碼神坑

ldap+flask+python2實現統一認證裏面的那些編碼神坑

color pattern 統一 sys and enc 都是 什麽 bin

首先想吐槽下,直接接手別人的項目,而且是經過四五個人手的項目,是怎麽個痛苦。兩三套代碼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實現統一認證裏面的那些編碼神坑