本文詳細剖析 Yii 框架的登入機制,涵蓋 Session、Cookie 管理與使用者驗證的核心邏輯。
Yii 是全棧式 MVC 框架,內建 MVC、ORM、快取、國際化、jQuery 整合、RBAC 權限控制、骨架產生器、輸入驗證、Widget、事件、主題、Web Service、日誌等功能。
預設由 SiteController::actionLogin() 處理:
public function actionLogin() {
$model = new LoginForm;
if (isset($_POST['LoginForm'])) {
$model->attributes = $_POST['LoginForm'];
if ($model->validate() && $model->login()) {
$this->redirect(Yii::app()->user->returnUrl);
}
}
$this->render('login', array('model' => $model));
}
流程:初始化 LoginForm → 驗證輸入 → 呼叫 login() → 成功則導向原頁,否則顯示登入表單。
LoginForm::login() 建立 UserIdentity 並呼叫 authenticate() 驗證帳密。成功後呼叫 Yii::app()->user->login()(即 CWebUser::login())。
CWebUser::login() 核心程式碼:
public function login($identity, $duration = 0) {
$this->changeIdentity($identity->getId(), $identity->getName(), $identity->getPersistentStates());
if ($duration > 0) {
if ($this->allowAutoLogin)
$this->saveToCookie($duration);
else
throw new CException(...);
}
}
saveToCookie() 會建立加密 Cookie,包含使用者 ID、名稱、過期時間與自訂狀態,並透過 CSecurityManager::hashData() 產生 HMAC 雜湊防止竄改。
Cookie 值由 hashData() 產生:HMAC + 原始資料。伺服器收到 Cookie 時,重新計算 HMAC 比對,確保資料完整性。驗證金鑰儲存在 runtime/state.bin,全站統一。
完整流程包含:Session 建立、Cookie 加密儲存、後續請求自動驗證,確保登入狀態安全持久。