怎樣弄網(wǎng)頁(yè)的快速登陸?
最簡(jiǎn)單的實(shí)現(xiàn)就是用PHP的會(huì)話機(jī)制.
用戶名和密碼驗(yàn)證通過(guò),就在服務(wù)器設(shè)置一些SESSION值,比如:
$_SESSION['login'] = 'true';
$_SESSION['user'] = 'foo';
來(lái)標(biāo)記這個(gè)服務(wù)器會(huì)話對(duì)應(yīng)的瀏覽器的會(huì)話cookie.
請(qǐng)求通過(guò) if (isset($_SESSION['login']) && $_SESSION['login'] === true ) 來(lái)判斷一個(gè)會(huì)話COOKIE是否已經(jīng)登錄.
而要實(shí)現(xiàn)一套通用的用戶登錄認(rèn)證機(jī)制,那就不要用PHP的會(huì)話機(jī)制了,因?yàn)檫@個(gè)機(jī)制默認(rèn)是PHP內(nèi)置實(shí)現(xiàn)的基于單機(jī)文件的和PHP序列化serialize格式的機(jī)制,其他語(yǔ)言拿到PHP這個(gè)會(huì)話COOKIE沒(méi)法驗(yàn)證和使用(讀寫服務(wù)器會(huì)話文件).
也就是需要設(shè)計(jì)另一套cookie或者token認(rèn)證機(jī)制實(shí)現(xiàn)多語(yǔ)言通用,不管什么語(yǔ)言,拿到這個(gè)cookie后,使用相同的解密算法如aes-128-cbc解密得到cookie內(nèi)容,取得cookie里保存的用戶信息,如用戶編號(hào)(id)和用戶顏值(salt),然后根據(jù)用戶編號(hào)查詢數(shù)據(jù)庫(kù),在比對(duì)數(shù)據(jù)庫(kù)里的用戶salt和cookie里的用戶salt,一致則通過(guò)cookie認(rèn)證.這個(gè)數(shù)據(jù)庫(kù)用戶salt是在用戶注冊(cè)和修改密碼時(shí)重新生成的東西,用于給密碼加鹽,也用于參與到cookie認(rèn)證.如果擔(dān)心用戶的salt泄露,還可以考慮給用戶的salt加一個(gè)系統(tǒng)的配置鹽再存到cookie中.
為了避免每個(gè)請(qǐng)求驗(yàn)證cookie時(shí)都查詢一次數(shù)據(jù)庫(kù),可以考慮把用戶對(duì)應(yīng)的顏值緩存到Redis中:key(user:id:salt) => value(xxx)