使用gii生成使用者表的model生成的幾個方法解析:
隨機數生成
protected function generatesalt($cost = 13)
$rand = $this->generaterandomkey(20);
$salt = sprintf("$2y$%02d$", $cost);
$salt .= str_replace('+', '.', substr(base64_encode($rand), 0, 22));
return $salt;
}
(1)、生成隨機數:$rand = $this->generaterandomkey(20);
(2)、加上字首:$salt = sprintf("$2y$%02d$", $cost); $cost=13時預設字首為$2y$13$
(3)、將$rand用base64加密,取前22位,並將+替換為.,最後加上字首返回
原理,使用blowfish標準加密生成60個字元的hash,利用salt的最大長度(個人理解,salt最大長度應該是在21到22個字元之間),將hash作為salt與明文密碼加密可得出一樣的結果;密碼最大為74個字元,超出則與74個字元密文相同;
setpassword()方法:
2、validatepassword($password)的方法
該方法會呼叫yii2/base/security的validpassword()方法,
security中的validpassword()方法會將使用者輸入的密碼與資料庫中的hash值一起加密
$test = crypt($password, $hash);
$n = strlen($test);
if ($n !== 60)
return $this->comparestring($test, $hash);
然後返回comparestring($test, $hash)方法的結果
comparestring方法:
//加上結束標記,防止mb_strlen()函式找不到結束標記
$expected .= "\0";
$actual .= "\0";
//呼叫mb_strlen($string, '8bit')函式按位獲取字串長度
$expectedlength = stringhelper::bytelength($expected);
$actuallength = stringhelper::bytelength($actual);
//獲得長度差值
$diff = $expectedlength - $actuallength;
//迴圈對比每一位的ascii值是否相等(先將密文hash與使用者輸入加密後的字串按位與,然後與diff按位或,返回結果)
for ($i = 0; $i < $actuallength; $i++)
return $diff === 0;
ord():
回字串第乙個字元的 ascii 值
crypt(str,salt):
str:必需。規定要編碼的字串。
salt:可選。用於增加被編碼字元數目的字串,以使編碼更加安全。如果未提供 salt 引數,則每次呼叫該函式時會隨機生成乙個。
mb_strlen():
獲取字串的長度,第二個引數為字元編碼。如果省略,則使用內部字元編碼。
$a | $b or(按位或) 將把 $a 和 $b 中任何乙個為 1 的位設為 1。
$a ^ $b xor(按位異或) 將把 $a 和 $b 中乙個為 1 另乙個為 0 的位設為 1。
~ $a not(按位取反) 將 $a 中為 0 的位設為 1,反之亦然。
$a << $b shift left(左移) 將 $a 中的位向左移動 $b 次(每一次移動都表示「乘以 2」)。
$a >> $b shift right(右移) 將 $a 中的位向右移動 $b 次(每一次移動都表示「除以 2」)。
Yii 2 登入使用者校驗
在登入頁面,輸入使用者名稱密碼後,yii2是如何完成使用者名稱和密碼的校驗的?根據yii的規則,使用者校驗的入口是從action開始的 sitecontroller actionlogin loginform login loginform validate loginform validatepa...
yii2登入筆記
yii2高階模板中自帶了登入註冊功能,這裡先記下登入功能的實現筆記 建立一張使用者user表,裡面需要根據user 的model檔案進行更改一些欄位名和新增,password hash是指用yii2進行雜湊加密後的密碼串。auth key使用使用者註冊時加的唯一標示,可以用來在瀏覽器記住使用者登入有...
yii2實戰之使用者註冊登入
繼控制器與檢視互動,本篇將講解如何自定義全域性函式,以及使用yii自帶的使用者註冊登入功能 有時候我們希望自定義一些函式,可以在全域性中呼叫,如php預設的var dump在頁面上的顯示效果並不好,尤其是多層級陣列的情況下,一大坨資料很難分辨。對此,yii提供了vardumper助手,可以輸出美觀易...