登陸流程做爲全部系統裏最經典的功能之一,表面上看也是很是簡單的一件事。你能夠寫的很簡單,只要username和password匹配下,不符合,就告訴前端匹配失敗,這次登陸失敗,反之成功。
這裏以解析OT的後臺管理登陸流程,來分解整個登陸過程,其實登陸過程當中的N多權限判斷是很是不簡單的(實際上不少系統也是如此,表面上看簡單的流程,簡單的功能,而背後有着很複雜的邏輯)
1.登陸的前端(輸入賬號和密碼),post提交後,檢測到有post提交,進入實例化對象。
$User = new UserApi;
$uid = $User->login($username, $password);
用這種調用外部UserApi的方法,有倆個好處很是明顯,能夠直接調用外部的權限驗證(整合的時候很是方便,實際上此處設計也是如此用意)。用戶登陸能夠從本地的數據庫進行驗證,也能夠從外部的調用數據進行驗證。本地有許多其餘的複雜驗證邏輯,封裝到了該對象的內部方法裏面。
2.登陸能夠選擇多種方式進行登陸(好比有的網站能夠郵箱登陸,也能夠手機登陸)
登陸的時候,須要對密碼進行反向解密運算(帝國裏運算是比較複雜的,用的是三重md5+鹽的方式),通常經常使用的是md5(substr(md5($test),0,13).$salt)這種屬於加密比較高的 由於鹽是隨機的,在不知道鹽的狀況下,就算知道是md5加密,也是沒法進行密碼破解。(弱密碼加密很容易經過md5速查表反查到)
3.驗證成功後,通常須要記錄用戶名的行爲操做(登陸成功的時候,須要記錄)
$this->updateLogin($user['id']); $this->save($data);
對每次登陸 作一個uid的最近登陸時間刷新
4.登陸成功後,會返回一個uid(這個uid是用戶會員中心的uid 對接外部或者ucenter_member)
$Member->login($uid)
在UC中心user中心登陸檢測到了後,同時在member表裏留一份作備份,進行驗證。檢測其是不是有效的用戶 字段status檢測
5.記錄用戶的登陸行爲(每一個用戶重要的操做,好比登陸,改寫字段這種通常須要存一份做爲備份)
action_log('user_login', 'member', $uid, $uid);
6.一樣更新其在member自己表裏的登陸時間,還有寫session 等操做行爲。
返回,確認登陸成功,成功後,跳轉到指定登陸界面
$this->success('登陸成功!', U('Index/index'));
這裏封裝了一個跳轉方法。
整個登陸流程,能夠簡化成一個很是經典的筆試題目,讓你寫個登陸流程,你會想到哪些操做。一開始筆試這個題目的時候,我直接想的覺得就是username和password進行對比,就能夠完成目標。而在實際應用場景裏,登陸須要注意的東西遠遠比這個對比複雜。
主要涉及到的一些知識點包括:
驗證碼(驗證碼的驗證基本是必不可少的),登陸條件檢測(好比限定登陸ip,頻繁試錯檢測),登陸後密碼的運算對比(這個是防止拿到了數據庫,直接入侵的狀況)登陸訪問權限(通常後臺登陸的時候,須要檢測對應會員的權限)登陸後行爲狀態的更新(通常更新最新登陸狀態,基本的會包括登陸ip,登陸時間,登陸次數)登錄後session的記錄(能夠cookie方式,設定失效時間,通常登陸都有個失效時間)登陸的行爲記錄(通常做爲系統管理員查看的時候使用,查看異常登陸很是有用)登陸後的頁面跳轉(登陸成功的跳轉頁面和登陸失敗後的跳轉頁面)前端