首頁  >  文章  >  後端開發  >  yii2 resetful 的授權驗證

yii2 resetful 的授權驗證

不言
不言原創
2018-04-19 14:13:171598瀏覽

什麼是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

<?php
namespaceapi\models;
  
useYii;
useyii\base\Model;
usecommon\models\User;
  
/**
 * Login form
 */
classLoginFormextendsModel
{
 public$username;
 public$password;
  
 private$_user;
  
 constGET_API_TOKEN =&#39;generate_api_token&#39;;
  
 publicfunctioninit ()
 {
  parent::init();
  $this->on(self::GET_API_TOKEN, [$this,&#39;onGenerateApiToken&#39;]);
 }
  
  
 /**
  * @inheritdoc
  * 对客户端表单数据进行验证的rule
  */
 publicfunctionrules()
 {
  return[
   [[&#39;username&#39;,&#39;password&#39;],&#39;required&#39;],
   [&#39;password&#39;,&#39;validatePassword&#39;],
  ];

相关推荐:

Yii2.0 PHP使用Sphinx

Yii2 的控制台命令

以上是yii2 resetful 的授權驗證的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn