yii2 resetful的授權驗證詳解

來源:互聯網
上載者:User
這次給大家帶來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中文網其它相關文章!

推薦閱讀:



聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.