在Flask中使用flask-login模塊和加鹽的方式進行註冊和登錄

  • 註冊注意要點:

    • 用戶名合法性檢測(長度、敏感詞、重複、特殊字符)
    • 密碼salt加密,密碼強度檢測
    • 用戶郵件/短信激活
  • 登錄注意要點

    • 服務器密碼校驗/三方校驗回調,token登記
      • 服務器端token關聯userid
      • 客戶端存儲token(app存儲到本地,瀏覽器存儲cookie)
    • 服務端/客戶端token的有效期設置(記住登錄)
    • 注意:token可以是sessionid,或者是cookie裏面的一個key
  • 登出注意要點

    • 服務端/客戶端token刪除
    • session清理
  • 頁面訪問注意要點

    • 客戶端:帶token的HTTP請求
    • 服務端:
      • 根據token獲取用戶的id
      • 根據用戶的id獲取用戶的具體信息
      • 用戶和頁面的訪問權限的處理
      • 渲染頁面跳轉頁面
  • Flask-login的注意要點

    • 官方參考文檔爲::http://flask-login.readthedocs.io/en/latest/
    • 1、初始化:login_manager = LoginManager(app) # 在init文件裏面設置
    • 2、回調函數(通過session裏面的id獲取用戶的信息),這model.py中設置
    @login_manager.user_loader
    def load_user(user_id):
     	return User.query.get(user_id)
    
    • 3、User用戶接口
      • is_authenticated
      • is_active
      • is_anonymous
      • get_id()
      • 核心函數和屬性
      • login_user(user)
      • logout_user()
      • login_required
      • current_user
  • 用戶數據安全性

    • 1、HTTPS註冊頁
    • 2、公鑰加密私鑰解密,支付寶h5頁面的支付密碼加密
    • 3、用戶密碼salt防止破解
    • 4、token的有效期設置
    • 5、單一平臺的單點登錄,登錄IP異常檢測
    • 6、用戶狀態的權限判斷
    • 7、添加驗證碼機制,防止爆破和批量註冊
  • 個人頁面的Ajax異步數據交互注意要點

    • 頁面的不刷新
    • 體驗更好
    • 傳輸數據更少
    • APP和網站通用

註冊頁面加鹽

加鹽可以防止破解,使得數據庫的密碼爲加密過後的字符串,防止數據庫信息丟失導致個人信息丟失冒用,一般不能輕易的被破解:

@app.route('/reg', methods={'post', 'get'})
def reg():
    # request arg
    # request form
    username = request.values.get('username').strip()
    password = request.values.get('password').strip()

    # 對數據進行檢驗
    if username == '' or password == '':
        return redirect_with_msg('/regloginpage', u'用戶名或者密碼爲空!', 'reglogin')
    # 如果用戶名已經存在,跳轉到首頁顯示對應的信息
    user = User.query.filter_by(username=username).first()
    if user != None:
        return redirect_with_msg('/regloginpage', u'用戶名已經存在!', 'reglogin')
    # 安全加鹽
    salt = ''.join(random.sample('0123456789abcdefghijklmnopqrstuvwsyzABCDEFGHIJKLMNOPQRSTUVWXYZ', 10))
    m = hashlib.md5()
    m.update((password + salt).encode("utf-8"))  # 使用摘要算法加鹽密碼, python3裏面要先encode進行編碼
    password = m.hexdigest()
    user = User(username, password, salt)
    # 提交數據
    db.session.add(user)
    db.session.commit()
    # 直接設置註冊用戶爲登錄狀態,不必跳轉到登錄頁面註冊,使用的是flask-login的登錄模塊
    login_user(user)

    next = request.values.get('next')
    # 因爲跳轉到註冊頁面的時候如果之前瀏覽過頁面會出現斜槓數目大於0的情況
    if next != None and next.startswith('/') > 0:
        return redirect(next)

    return redirect('/')

登錄加鹽驗證

可以有效防止破解,邏輯和註冊答題類似:

@app.route('/login', methods={'post', 'get'})
def login():
    username = request.values.get('username').strip()
    password = request.values.get('password').strip()

    # 驗證數據
    if username == '' or password == '':
        return redirect_with_msg('/regloginpage', u'用戶名或者密碼爲空!', 'reglogin')

    # 驗證用戶是否爲空
    user = User.query.filter_by(username=username).first()

    if user == None:
        return redirect_with_msg('/regloginpage', u'用戶名不存在!', 'reglogin')

    m = hashlib.md5()
    m.update((password + user.salt).encode("utf-8"))
    if m.hexdigest() != user.password:
        return redirect_with_msg('/regloginpage', u'用戶名或者密碼不正確!', 'reglogin')

    # 否則登錄成功
    login_user(user)

    next = request.values.get('next')
    # 因爲跳轉到註冊頁面的時候如果之前瀏覽過頁面會出現斜槓數目大於0的情況
    if next != None and next.startswith('/') > 0:
        # 直接跳轉到想要點開的頁面,是用戶體驗優化的做法之一
        return redirect(next)

    return redirect('/')

本文檔代碼和項目URL:
https://github.com/too-hoo/myinstagram/blob/master/myinstagram/views.py

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章