国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > PHP > 正文

yii2 resetful 的授權驗證

2024-05-04 21:50:24
字體:
來源:轉載
供稿:網(wǎng)友

什么是restful風格的api呢?我們之前有寫過大篇的文章來介紹其概念以及基本操作。

既然寫過了,那今天是要說點什么嗎?

這篇文章主要針對實際場景中api的部署來寫。

我們今天就來大大的侃侃那些年api遇到的授權驗證問題!獨家干活,如果看完有所受益,記得不要忘記給我點贊哦。

業(yè)務分析

我們先來了解一下整個邏輯

1.用戶在客戶端填寫登錄表單

2.用戶提交表單,客戶端請求登錄接口login

3.服務端校驗用戶的帳號密碼,并返回一個有效的token給客戶端

4.客戶端拿到用戶的token,將之存儲在客戶端比如cookie中

5.客戶端攜帶token訪問需要校驗的接口比如獲取用戶個人信息接口

6.服務端校驗token的有效性,校驗通過,反正返回客戶端需要的信息,校驗失敗,需要用戶重新登錄

本文我們以用戶登錄,獲取用戶的個人信息為例進行詳細的完整版說明。

以上,便是我們本篇文章要實現(xiàn)的重點。先別激動,也別緊張,分析好了之后,細節(jié)部分我們再一步一個腳印走下去。

準備工作

1.你應該有一個api應用.

2.對于客戶端,我們準備采用postman進行模擬,如果你的google瀏覽器還沒有安裝postman,請先自行下載

3.要測試的用戶表需要有一個api_token的字段,沒有的請先自行添加,并保證該字段足夠長度

4.api應用開啟了路由美化,并先配置post類型的login操作和get類型的signup-test操作

5.關閉了user組件的session會話

關于上面準備工作的第4點和第5點,我們貼一下代碼方便理解

  1. 'components'=> [ 
  2.  'user'=> [  
  3.   'identityClass'=>'common/models/User'
  4.   'enableAutoLogin'=> true, 
  5.   'enableSession'=> false, 
  6.  ], 
  7.  'urlManager'=> [ 
  8.   'enablePrettyUrl'=> true, 
  9.   'showScriptName'=> false, 
  10.   'enableStrictParsing'=> true, 
  11.   'rules'=> [ 
  12.    [ 
  13.     'class'=>'yii/rest/UrlRule'
  14.     'controller'=> ['v1/user'], 
  15.     'extraPatterns'=> [ 
  16.      'POST login'=>'login'
  17.      'GET signup-test'=>'signup-test'
  18.     ] 
  19.    ], 
  20.   ] 
  21.  ], 
  22.  // ...... 
  23. ], 

signup-test操作我們后面添加測試用戶,為登錄操作提供便利。其他類型的操作后面看需要再做添加。

認證類的選擇

我們在api/modules/v1/controllers/UserController中設定的model類指向 common/models/User類,為了說明重點這里我們就不單獨拿出來重寫了,看各位需要,有必要的話再單獨copy一個User類到api/models下。

校驗用戶權限我們以 yii/filters/auth/QueryParamAuth 為例

  1. useyii/filters/auth/QueryParamAuth; 
  2.    
  3. publicfunctionbehaviors()  
  4.  returnArrayHelper::merge (parent::behaviors(), [  
  5.    'authenticator'=> [  
  6.     'class'=> QueryParamAuth::className()  
  7.    ]  
  8.  ] ); 

如此一來,那豈不是所有訪問user的操作都需要認證了?那不行,客戶端第一個訪問login操作的時候哪來的token,yii/filters/auth/QueryParamAuth對外提供一個屬性,用于過濾不需要驗證的action。我們將UserController的behaviors方法稍作修改

  1. publicfunctionbehaviors()  
  2.  returnArrayHelper::merge (parent::behaviors(), [  
  3.    'authenticator'=> [  
  4.     'class'=> QueryParamAuth::className(), 
  5.     'optional'=> [ 
  6.      'login'
  7.      'signup-test' 
  8.     ], 
  9.    ]  
  10.  ] ); 

這樣login操作就無需權限驗證即可訪問了。

添加測試用戶

為了避免讓客戶端登錄失敗,我們先寫一個簡單的方法,往user表里面插入兩條數(shù)據(jù),便于接下來的校驗。

UserController增加signupTest操作,注意此方法不屬于講解范圍之內(nèi),我們僅用于方便測試。

  1. usecommon/models/User; 
  2. /** 
  3.  * 添加測試用戶 
  4.  */ 
  5. publicfunctionactionSignupTest () 
  6.  $user=newUser(); 
  7.  $user->generateAuthKey(); 
  8.  $user->setPassword('123456'); 
  9.  $user->username ='111'
  10.  $user->email ='111@111.com'
  11.  $user->save(false); 
  12.    
  13.  return
  14.   'code'=> 0 
  15.  ]; 

如上,我們添加了一個username是111,密碼是123456的用戶

登錄操作

假設用戶在客戶端輸入用戶名和密碼進行登錄,服務端login操作其實很簡單,大部分的業(yè)務邏輯處理都在api/models/loginForm上,來先看看login的實現(xiàn)

  1. useapi/models/LoginForm; 
  2.    
  3. /** 
  4.  * 登錄 
  5.  */ 
  6. publicfunctionactionLogin () 
  7.  $model=newLoginForm; 
  8.  $model->setAttributes(Yii::$app->request->post()); 
  9.  if($user=$model->login()) { 
  10.   if($userinstanceofIdentityInterface) { 
  11.    return$user->api_token; 
  12.   }else
  13.    return$user->errors; 
  14.   } 
  15.  }else
  16.   return$model->errors; 
  17.  } 

登錄成功后這里給客戶端返回了用戶的token,再來看看登錄的具體邏輯的實現(xiàn)

新建api/models/LoginForm.PHP

  1. namespaceapi/models; 
  2.    
  3. useYii; 
  4. useyii/base/Model; 
  5. usecommon/models/User; 
  6.    
  7. /** 
  8.  * Login form 
  9.  */ 
  10. classLoginFormextendsModel 
  11.  public$username
  12.  public$password
  13.    
  14.  private$_user
  15.    
  16.  constGET_API_TOKEN ='generate_api_token'
  17.    
  18.  publicfunctioninit () 
  19.  { 
  20.   parent::init(); 
  21.   $this->on(self::GET_API_TOKEN, [$this,'onGenerateApiToken']); 
  22.  } //Vevb.com 
  23.    
  24.    
  25.  /** 
  26.   * @inheritdoc 
  27.   * 對客戶端表單數(shù)據(jù)進行驗證的rule 
  28.   */ 
  29.  publicfunctionrules() 
  30.  { 
  31.   return
  32.    [['username','password'],'required'], 
  33.    ['password','validatePassword'], 
  34.   ]; 

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 大田县| 永康市| 亚东县| 清涧县| 双峰县| 文成县| 巫溪县| 土默特右旗| 华阴市| 桑日县| 泸水县| 定西市| 潜江市| 井冈山市| 盐池县| 桐梓县| 呈贡县| 光泽县| 台湾省| 新蔡县| 沈阳市| 北碚区| 民勤县| 开封县| 聂拉木县| 伽师县| 奉贤区| 台南县| 崇信县| 淅川县| 南丹县| 宜都市| 英山县| 贵南县| 连州市| 丰镇市| 广德县| 昌乐县| 黄石市| 芜湖县| 利川市|