關(guān)于多字段(第三方登錄)字段設計的解決
眾所周知,一個成熟的網(wǎng)站必然是支持多種登錄方式的雏逾。市場上當然常見的就是有類似于github、微博郑临、qq栖博、微信登錄等。
所以這些天厢洞,我會一一根據(jù)這些功能進行實操仇让。昨天完成了微博登錄,今天講一下字段設計的問題
1躺翻、字段如何合理分開
首先丧叽,假設的字段如下:
用戶名
密碼
聯(lián)系方式
頭像
個人信息
性別
通信地址
年齡
第三方登錄字段一
第三方登錄字段二
當然,以上的只是簡單的公你,當依舊如此踊淳,也顯得字段非常多了。 在 數(shù)據(jù)庫 設計原則中必須有隔離性省店,大量的字段存在對索引非常不友好嚣崭,容易造成不必要的消耗
根據(jù)重要性區(qū)別:
用戶名、密碼懦傍、通信方式(如作為登錄字段存在的話可存在)、登錄字段一芦劣、登錄字段二
以上粗俱,足以滿足在登錄條件下的必須,其他的通過關(guān)聯(lián)查詢虚吟,可以輕而易舉的得到
關(guān)于地址的設計
必須將地址另做一張表寸认,不能用戶信息共存,地址是一對多的形式存在串慰,可以通過中間表進行關(guān)聯(lián)或者直接關(guān)聯(lián)偏塞。
2、 如何有效性的解決登錄字段的問題呢
首先邦鲫,合理共同使用公共代碼灸叼。
公共代碼有哪些呢神汹?
加密函數(shù) / 比較密碼正確性
獲取登錄字段類型(使用一個函數(shù),判斷出當前登錄的字段古今,返回一個字段名即可)
獲取用戶信息
第一步: 獲取當前的字段進行用戶查詢屁魏,密碼對比,取得登錄驗證
/**
* 返回登錄的字段類型
*
* @param $value
* @return bool|mixed|string
*/
function checkParamType($value) {
// 是否郵箱匹配
if( filter_var($value,FILTER_VALIDATE_EMAIL) ) {
return 'email';
}
// 判斷是否手機匹配
$res = filter_var($value,FILTER_CALLBACK,[
'options' => function ($value){
if( preg_match('/^1[34578]\d{9}$/',$value) ) {
return 'phone';
}
}
]);
return is_null($res) ? false : $res;
}
第二步:解決登錄密碼校驗的問題
我這里將獲取用戶和密碼校驗分離開來捉腥,通過字段查詢到用戶氓拼,在進行密碼校驗;未查找到抵碟,直接返回沒有用戶
...
public static function store(LoginRequest $request)
{
$name = $request->name;
$password = $request->password;
$field = checkParamType($name) ? checkParamType($name) : 'name' ;
if( !$user = User::getUserInfo($name,$field) ) {
session()->flash('status','用戶不存在');
return redirect()->back();
}
if( !$user = self::checkPassword($user,$password) ){
session()->flash('status','密碼錯誤');
return redirect()->back();
}
\Auth::login($user);
return redirect('/');
}
...
public static function checkPassword($user, $pwd)
{
// 加密對比
if( $user->password === eny($pwd,$user->salt)) {
return $user;
}
return false;
}
...
關(guān)于注冊的邏輯流程
注冊我采用的是桃漾,當?shù)谌降卿浭跈?quán)登錄后,直接給與登錄權(quán)限拟逮。
注冊用戶撬统,注冊后跳轉(zhuǎn)到登錄頁面
我采用了可 郵箱 可手機號碼的登錄方式
-
獲取驗證碼
第一步先,用戶需要填寫郵箱唱歧,點擊發(fā)送驗證碼按鈕宪摧,發(fā)送獲得驗證碼。
服務器端收到郵箱后生存緩存有效期颅崩,將用戶的郵箱寫入緩存几于,同時發(fā)送郵箱
用戶收到郵箱的驗證碼,寫入注冊字段
提交字段沿后,驗證相關(guān)數(shù)據(jù)的有效性
短信接口采用的騰訊云平臺
原創(chuàng):轉(zhuǎn)載請聯(lián)系我 1562135624@qq.com