亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > PHP > 正文

Yii框架登錄流程分析

2024-05-04 23:28:31
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了Yii框架登錄流程,詳細的分析了Yii框架的原理與登錄的詳細流程,有助于深入了解Yii框架的原理,需要的朋友可以參考下
 
 

本文詳細分析了Yii框架的登錄流程。分享給大家供大家參考。具體分析如下:

Yii對于新手來說上手有點難度,特別是關于session,cookie和用戶驗證?,F在我們就Yii中登錄流程,來講講Yii開發中如何設置session,cookie和用戶驗證方面的一些通用知識

1. 概述

Yii是一個全棧式的MVC框架,所謂全棧式指的是Yii框架本身實現了web開發中所要用到的所有功能,比如MVC,ORM(DAO/ActiveRecord), 全球化(I18N/L10N), 緩存(caching), 基于jQuery Ajax支持(jQuery-based AJAX support), 基于角色的用戶驗證(authentication and role-based access control), 程序骨架生成器(scaffolding), 輸入驗證(input validation), 窗體小部件(widgets), 事件(events), 主題(theming), web服務(Web services),日志(logging)等功能. 詳見官方說明.

這里要說的只是Yii的登錄流程. 用Yii開發一般是用一個叫做Yii shell的控制臺工具生成一個程序的骨架,這個骨架為我們分配好了按MVC方式開發web程序的基本結構,并且是一個可以直接運行的程序. 如果你了解 Ruby on Rails的話,原理是一樣的.

2.網站登錄流程

生成的程序中有一個protected目錄,下面的controllers目錄有個叫SiteController.php的文件,這個文件是自動生成的,里面有一個叫actionLogin的文件.程序登錄流程默認就是從來開始的. Yii把類似于 http://domain.com/index.php?r=site/login 這樣的地址通過叫router的組件轉到上面說的actionLogin方法里的. 這個路由的功能不是的這里說的重點.actionLogin方法的代碼是這樣的.

復制代碼代碼如下:
public function actionLogin(){
$model=new LoginForm;
// collect user input data
if(isset($_POST['LoginForm'])){
$model->attributes=$_POST['LoginForm'];
// validate user input and redirect to the previous page if valid
if($model->validate() && $model->login())
$this->redirect(Yii::app()->user->returnUrl);
}
// display the login form
$this->render('login',array('model'=>$model));
}

 

首先初始化一個LoginForm類,然后判斷是否是用戶點了登錄后的請求(查看請求中有沒有POST數據),如果是的話則先驗證輸入($model->validate)然后嘗試登錄($model->logiin),如果都成功,就跳轉到登錄前的頁面,否則顯示登錄頁面.

3.框架登錄流程

LoginForm類繼承于CFormModel,間接繼承于CModel,所以他提供了CModel提供了一些像驗證和錯誤處理方面的功能.其中的login方法就是執行驗證操作的.方法首先通過用戶提供的用戶名和密碼生成一個用來表示用戶實體的UserIdentity類,該類中的authenticate方法執行實際的驗證動作,比如從數據庫中判斷用戶名和密碼是否匹配. LoginForm類的login方法通過查詢authenticate是否有錯誤發生來判斷登錄是否成功.如果成功則執行Yii::app()->user->login方法來使用戶真正的的登錄到系統中. 前面講到的這些流程是用戶程序提供的,而Yii::app()->user->login也就是CWebUser的login方法是Yii框架提供的流程.我們來看看他做了些什么.下面是該方面的代碼,位于(Yii)webauthCWebUser.php文件中.

復制代碼代碼如下:
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(Yii::t('yii','{class}.allowAutoLogin must be set true in order to use cookie-based authentication.',
array('{class}'=>get_class($this))));
}
}

 

參數$identity是上面登錄時生成的UserIdentity類,里面包含了基本的用戶信息,如上面的Id,Name,還有可能是其它自定義的數據getPersistentStates. 程序首先把$identity中的數據復制到CWebUser的實例中,這個過程包括了生成相應的session,其實主要目的是生成session.然后根據參數$duration(cookie保存的時間)和allowAutoLogin屬性來判斷是否生成可以用來下次自動登錄的cookie.如果是則生成cookie(saveToCookie).

復制代碼代碼如下:
protected function saveToCookie($duration){
$app=Yii::app();
$cookie=$this->createIdentityCookie($this->getStateKeyPrefix());
$cookie->expire=time()+$duration;
$data=array(
$this->getId(),
$this->getName(),
$duration,
$this->saveIdentityStates(),
);
$cookie->value=$app->getSecurityManager()->hashData(serialize($data));
$app->getRequest()->getCookies()->add($cookie->name,$cookie);
}

 

首先是新建一個CHttpCookie,cookie的key通過getStateKeyPrefix方法取得,該方法默認返回md5('Yii.'.get_class($this).'.'.Yii::app()->getId());即類名和CApplication的Id,這個Id又是crc32函數生成的一個值.這個具體的值是多少無關緊要. 但是每次都是產生一樣的值的. 接著設置expire,cookie的過期時間,再新建一個array,包含了基本數據,接著比較重要的是計算取得cookie的值,$app->getSecurityManager()->hashData(serialize($data)), getSecurityManager返回一個CSecurityManager的對象,并調用hashData方法.

復制代碼代碼如下:
public function hashData($data){
$hmac=$this->computeHMAC($data);
return $hmac.$data;
}

 

protected function computeHMAC($data){
if($this->_validation==='SHA1'){
$pack='H40';
$func='sha1';
}
else{
$pack='H32';
$func='md5';
}
$key=$this->getValidationKey();
$key=str_pad($func($key), 64, chr(0));
return $func((str_repeat(chr(0x5C), 64) ^ substr($key, 0, 64)) . pack($pack, $func((str_repeat(chr(0x36), 64) ^ substr($key, 0, 64)) . $data)));
}

 

hashData調用computHMAC方法生成一個hash值. hash的算法有SHA1和MD5兩種,默認是用SHA1的. hash的時候還要生成一個validationKey(驗證碼)的,然后把驗證碼和要hash的值進行一些故意安排的運算,最終生成一個40位的SHA1,hash值.  hashData方法最終返回的是computeHMAC生成的hash值和經序列化的原始數據生成的字符串.這個過程有也許會有疑問. 如為什么要有驗證碼?

我們先來看一下基于cookie的驗證是怎么操作的.服務器生成一個cookie后發送的瀏覽器中,并根據過期時間保存在瀏覽器中一段時間.用戶每次通過瀏覽器訪問這個網站的時候都會隨HTTP請求把cookie發送過去,這是http協議的一部分, 與語言和框架無關的. 服務器通過判斷發過來的cookie來決定該用戶是否可以把他當作已登錄的用戶.但是cookie是客戶端瀏覽器甚至其它程序發過來的,也就是說發過來的cookie可能是假的中被篡改過的.所以服務器要通過某種驗證機制來判斷是否是之后自己發過去的cookie.這個驗證機制就是在cookie中包含一個hash值和生成這串hash值的原始數據.服務器接到cookie后取出原始數據,然后按原來的方法生成一個hash值來和發過來的hash值比較,如果相同,則信任該cookie,否則肯定是非法請求.比如我的Yii網站生成了這樣一個cookie:

cookie name:b72e8610f8decd39683f245d41394b56

cookie value: 1cbb64bdea3e92c4ab5d5cb16a67637158563114a%3A4%3A%7Bi%3A0%3Bs%3A7%3A%22maxwell%22%3Bi%3A1%3Bs%3A7%3A%22maxwell%22%3Bi%3A2%3Bi%3A3600%3Bi%3A3%3Ba%3A2%3A%7Bs%3A8%3A%22realname%22%3Bs%3A6%3A%22helloc%22%3Bs%3A4%3A%22myId%22%3Bi%3A123%3B%7D%7D

cookie name是網站統一生成的一個md5值. cookie value的值為兩個部分,就是hashData方法生成的一個字符串.前面部分是hash值,后面是原始值.也就是說前面的1cbb64bdea3e92c4ab5d5cb16a67637158563114是hash值,后面是原始值.這個hash值是用SHA1生成的40位的字符串. 服務器把后面的原始值通過算法hash出一個值和這個傳過來的hash值比較就知道是合法不審非法請求了. 那驗證碼呢?

如果服務器只是簡單的把后面的原始值直接用SHA1或MD5,hash的話,那發送請求的人可以隨意修改這個原始值和hash值來通過服務器的驗證.因為SHA1算法是公開的,每個人都可以使用. 所以服務端需要在hash的時候加一個客戶端不知道的驗證碼來生成一個客戶端無法通過原始值得到正確hash的hash值(有點繞:) ). 這就是需要驗證碼的原因.并且這個驗證碼必須是全站通用的,所以上面的getValidationKey方法是生成一個全站唯一的驗證碼并保存起來.默認情況下,驗證碼是一個隨機數,并保存在(yii)runtimestate.bin文件中.這樣對每個請求來說都是一樣的.

登錄流程的最后就是把生成的cookie發送到瀏覽器中. 下次請求的時候可以用來驗證.

希望本文所述對大家基于Yii框架的PHP程序設計有所幫助。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产成+人+综合+亚洲欧美丁香花| 亚洲免费高清视频| 国产在线观看精品一区二区三区| 中文字幕亚洲自拍| 91超碰caoporn97人人| 日韩男女性生活视频| 欧美激情精品久久久久久蜜臀| 欧美激情亚洲视频| 美日韩在线视频| 亚洲欧美日韩区| 原创国产精品91| 另类色图亚洲色图| 美女扒开尿口让男人操亚洲视频网站| 青青久久av北条麻妃黑人| 亚洲欧洲一区二区三区久久| 久久中文久久字幕| 在线观看视频亚洲| 国产一区二区黑人欧美xxxx| 国产在线观看精品一区二区三区| 国产成人综合av| 国产在线观看91精品一区| 国产精品久久婷婷六月丁香| 欧美精品少妇videofree| 欧美在线视频免费| 国产精品青青在线观看爽香蕉| 精品五月天久久| 亚洲日本欧美日韩高观看| 国产91对白在线播放| 久久精品99久久久香蕉| 午夜精品福利在线观看| 亚洲成色999久久网站| 成人在线小视频| 国色天香2019中文字幕在线观看| 亚洲第一区第二区| 亚洲精品福利在线观看| 亚洲福利精品在线| 欧美日韩性生活视频| 在线观看成人黄色| 国产精品极品美女粉嫩高清在线| 欧美另类xxx| 日韩美女在线看| 亚洲免费高清视频| 成人情趣片在线观看免费| 亚洲欧美日韩在线高清直播| 欧美极品xxxx| 精品国产一区二区三区在线观看| 51久久精品夜色国产麻豆| 国产日韩精品在线| 97香蕉久久夜色精品国产| 色播久久人人爽人人爽人人片视av| 亚洲第一综合天堂另类专| 中文字幕亚洲一区在线观看| 国产精品福利无圣光在线一区| 欧美怡春院一区二区三区| 57pao国产精品一区| 色在人av网站天堂精品| 久久成年人免费电影| 亚洲女人被黑人巨大进入| 亚洲二区在线播放视频| 精品视频在线播放色网色视频| 久久久人成影片一区二区三区| 欧美视频在线免费| 欧美另类精品xxxx孕妇| 日本精品一区二区三区在线| 狠狠色狠狠色综合日日五| 欧美激情日韩图片| 97国产精品视频| 久久亚洲精品一区二区| 日韩av在线网址| 久久夜色精品亚洲噜噜国产mv| 少妇高潮久久久久久潘金莲| 欧美交受高潮1| 日韩天堂在线视频| 伊人久久综合97精品| 国产一区香蕉久久| 91九色国产社区在线观看| 日韩精品在线观看一区二区| 播播国产欧美激情| 91久久精品国产91性色| 国产日韩一区在线| 欧美精品一二区| 欧美性猛交xxxx乱大交蜜桃| 热门国产精品亚洲第一区在线| 欧美性xxxxx极品娇小| 国产精品成人在线| 欧美性受xxxx黑人猛交| 4438全国亚洲精品在线观看视频| 在线视频一区二区| 久久伊人精品视频| 国产精品第8页| 欧美成人免费全部| 国产精品久久在线观看| 久久免费少妇高潮久久精品99| 久久伊人精品视频| 色偷偷噜噜噜亚洲男人的天堂| 夜夜嗨av色综合久久久综合网| 国产精品91在线| 91在线免费视频| 日韩高清电影免费观看完整版| 国产精品爱久久久久久久| 国产主播精品在线| 91精品国产乱码久久久久久久久| 国产精品久久久91| 国产精品99久久久久久久久久久久| 欧美日韩亚洲国产一区| 久久久中精品2020中文| 欧美成人精品一区二区| 国产精品亚洲自拍| 97在线观看免费高清| 美女999久久久精品视频| 国内精品一区二区三区四区| 亚洲国产高清高潮精品美女| 亚洲日韩欧美视频一区| 欧美激情视频在线| 国产一区深夜福利| 91精品国产成人www| 欧美丝袜一区二区三区| 亚洲久久久久久久久久| 97精品国产91久久久久久| 国产精品视频免费在线| 欧美黄色小视频| 国产美女扒开尿口久久久| 91亚洲国产精品| 国产精品视频精品| 最好看的2019的中文字幕视频| 欧美特黄级在线| 日韩中文字幕在线观看| 欧美色播在线播放| 最近2019中文免费高清视频观看www99| 国产精品美女www爽爽爽视频| 国产精品毛片a∨一区二区三区|国| 亚洲精品国产精品国自产观看浪潮| 欧美第一黄网免费网站| 国产精品福利观看| 91免费视频国产| 亚洲精品久久久久久久久久久久| y97精品国产97久久久久久| 久久久久国产精品www| 亚洲国产精彩中文乱码av| 自拍偷拍免费精品| 国产精品久久久久久五月尺| 亚洲人成在线观看网站高清| 午夜剧场成人观在线视频免费观看| 亚洲欧美国内爽妇网| 亚洲欧美色婷婷| 欧美另类极品videosbest最新版本| 8x海外华人永久免费日韩内陆视频| 国语自产精品视频在线看| 夜夜嗨av色一区二区不卡| 青青久久av北条麻妃黑人| 亚洲国产欧美一区二区三区同亚洲| 91wwwcom在线观看| 国产日韩在线看片| 亚洲福利影片在线| 欧美日韩国产一区二区| 久久精品免费播放| 亚洲成人亚洲激情| 亚洲片av在线| 亚洲激情视频网站| 国产精品露脸av在线| 国产男人精品视频| 狠狠久久五月精品中文字幕| 国产精品日韩欧美| 久久久视频免费观看|