ldap+flask+python2實現統一認證裏面的那些編碼神坑
阿新 • • 發佈:2018-08-10
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實現統一認證裏面的那些編碼神坑