這次給大家帶來yii2 resetful的授權驗證詳解,yii2 resetful授權驗證的注意事項有哪些,下面就是實戰案例,一起來看一下。
什麼是restful風格的api呢?我們之前有寫過大篇的文章來介紹其概念以及基本操作。
既然寫過了,那今天是要說點什麼嗎?
這篇文章主要針對實際情境中api的部署來寫。
我們今天就來大大的侃侃那些年api遇到的授權驗證問題!獨家幹活,如果看完有所受益,記得不要忘記給我點贊哦。
業務分析
我們先來瞭解一下整個邏輯
1.使用者在用戶端填寫登入表單
2.使用者提交表單,用戶端請求登入介面login
3.服務端校正使用者的帳號密碼,並返回一個有效token給用戶端
4.用戶端拿到使用者的token,將之儲存在用戶端比如cookie中
5.用戶端攜帶token訪問需要校正的介面比如擷取使用者個人資訊介面
6.服務端校正token的有效性,校正通過,反正返回用戶端需要的資訊,校正失敗,需要使用者重新登入
本文我們以使用者登入,擷取使用者的個人資訊為例進行詳細的完整版說明。
以上,便是我們本篇文章要實現的重點。先別激動,也別緊張,分析好了之後,細節部分我們再一步一個腳印走下去。
準備工作
1.你應該有一個api應用.
2.對於用戶端,我們準備採用postman進行類比,如果你的google瀏覽器還沒有安裝postman,請先自行下載
3.要測試的使用者表需要有一個api_token的欄位,沒有的請先自行添加,並保證該欄位足夠長度
4.api應用開啟了路由美化,並先配置post類型的login操作和get類型的signup-test操作
5.關閉了user組件的session會話
關於上面準備工作的第4點和第5點,我們貼一下代碼方便理解
'components'=> [ 'user'=> [ 'identityClass'=>'common\models\User', 'enableAutoLogin'=> true, 'enableSession'=> false, ], 'urlManager'=> [ 'enablePrettyUrl'=> true, 'showScriptName'=> false, 'enableStrictParsing'=> true, 'rules'=> [ [ 'class'=>'yii\rest\UrlRule', 'controller'=> ['v1/user'], 'extraPatterns'=> [ 'POST login'=>'login', 'GET signup-test'=>'signup-test', ] ], ] ], // ......],
signup-test操作我們後面添加測試使用者,為登入操作提供便利。其他類型的操作後面看需要再做添加。
認證類的選擇
我們在api\modules\v1\controllers\UserController中設定的model類指向 common\models\User類,為了說明重點這裡我們就不單獨拿出來重寫了,看各位需要,有必要的話再單獨copy一個User類到api\models下。
校正使用者權限我們以 yii\filters\auth\QueryParamAuth 為例
useyii\filters\auth\QueryParamAuth;publicfunctionbehaviors() { returnArrayHelper::merge (parent::behaviors(), [ 'authenticator'=> [ 'class'=> QueryParamAuth::className() ] ] );}
如此一來,那豈不是所有訪問user的操作都需要認證了?那不行,用戶端第一個訪問login操作的時候哪來的token,yii\filters\auth\QueryParamAuth對外提供一個屬性,用於過濾不需要驗證的action。我們將UserController的behaviors方法稍作修改
publicfunctionbehaviors() { returnArrayHelper::merge (parent::behaviors(), [ 'authenticator'=> [ 'class'=> QueryParamAuth::className(), 'optional'=> [ 'login', 'signup-test' ], ] ] );}
這樣login操作就無需許可權驗證即可訪問了。
添加測試使用者
為了避免讓用戶端登入失敗,我們先寫一個簡單的方法,往user表裡面插入兩條資料,便於接下來的校正。
UserController增加signupTest操作,注意此方法不屬於講解範圍之內,我們僅用於方便測試。
usecommon\models\User;/** * 添加測試使用者 */publicfunctionactionSignupTest (){ $user=newUser(); $user->generateAuthKey(); $user->setPassword('123456'); $user->username ='111'; $user->email ='111@111.com'; $user->save(false); return[ 'code'=> 0 ];}
如上,我們添加了一個username是111,密碼是123456的使用者
登入操作
假設使用者在用戶端輸入使用者名稱和密碼進行登入,服務端login操作其實很簡單,大部分的商務邏輯處理都在api\models\loginForm上,來先看看login的實現
useapi\models\LoginForm;/** * 登入 */publicfunctionactionLogin (){ $model=newLoginForm; $model->setAttributes(Yii::$app->request->post()); if($user=$model->login()) { if($userinstanceofIdentityInterface) { return$user->api_token; }else{ return$user->errors; } }else{ return$model->errors; }}
登入成功後這裡給用戶端返回了使用者的token,再來看看登入的具體邏輯的實現
建立api\models\LoginForm.PHP
<?phpnamespaceapi\models;useYii;useyii\base\Model;usecommon\models\User;/** * Login form */classLoginFormextendsModel{ public$username; public$password; private$_user; constGET_API_TOKEN ='generate_api_token'; publicfunctioninit () { parent::init(); $this->on(self::GET_API_TOKEN, [$this,'onGenerateApiToken']); } /** * @inheritdoc * 對用戶端表單資料進行驗證的rule */ publicfunctionrules() { return[ [['username','password'],'required'], ['password','validatePassword'], ];
相信看了本文案例你已經掌握了方法,更多精彩請關注php中文網其它相關文章!
推薦閱讀: