当前位置:首页 > PHP教程 > php高级应用 > 列表

yii2 resetful 的授权验证

发布:smiling 来源: PHP粉丝网  添加日期:2018-10-17 09:29:54 浏览: 评论:0 

什么是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点,我们贴一下代码方便理解

  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. { 
  5.  returnArrayHelper::merge (parent::behaviors(), [  
  6.    'authenticator'=> [  
  7.     'class'=> QueryParamAuth::className()  
  8.    ]  
  9.  ] ); 
  10. } 

如此一来,那岂不是所有访问user的操作都需要认证了?那不行,客户端第一个访问login操作的时候哪来的token,yii\filters\auth\QueryParamAuth对外提供一个属性,用于过滤不需要验证的action。我们将UserController的behaviors方法稍作修改

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

这样login操作就无需权限验证即可访问了。

添加测试用户

为了避免让客户端登录失败,我们先写一个简单的方法,往user表里面插入两条数据,便于接下来的校验。

UserController增加signupTest操作,注意此方法不属于讲解范围之内,我们仅用于方便测试。

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

如上,我们添加了一个username是111,密码是123456的用户

登录操作

假设用户在客户端输入用户名和密码进行登录,服务端login操作其实很简单,大部分的业务逻辑处理都在api\models\loginForm上,来先看看login的实现

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

登录成功后这里给客户端返回了用户的token,再来看看登录的具体逻辑的实现

新建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. { 
  12.  public$username; 
  13.  public$password; 
  14.    
  15.  private$_user; 
  16.    
  17.  constGET_API_TOKEN ='generate_api_token'; 
  18.    
  19.  publicfunctioninit () 
  20.  { 
  21.   parent::init(); 
  22.   $this->on(self::GET_API_TOKEN, [$this,'onGenerateApiToken']); 
  23.  } //phpfensi.com 
  24.    
  25.    
  26.  /** 
  27.   * @inheritdoc 
  28.   * 对客户端表单数据进行验证的rule 
  29.   */ 
  30.  publicfunctionrules() 
  31.  { 
  32.   return[ 
  33.    [['username','password'],'required'], 
  34.    ['password','validatePassword'], 
  35.   ]; 

Tags: yii2 resetful 的授权验证

分享到: