当前位置:Gxlcms > PHP教程 > yii2resetful的授权验证详解

yii2resetful的授权验证详解

时间:2021-07-01 10:21:17 帮助过:48人阅读

这次给大家带来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点,我们贴一下代码方便理解

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

如此一来,那岂不是所有访问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. return[
  14. 'code'=> 0
  15. ];
  16. }

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

登录操作

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

  1. useapi\models\LoginForm;
  2. /**
  3. * 登录
  4. */
  5. publicfunctionactionLogin ()
  6. {
  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. }
  18. }

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

新建api\models\LoginForm.PHP

  1. <?php
  2. namespaceapi\models;
  3. useYii;
  4. useyii\base\Model;
  5. usecommon\models\User;
  6. /**
  7. * Login form
  8. */
  9. classLoginFormextendsModel
  10. {
  11. public$username;
  12. public$password;
  13. private$_user;
  14. constGET_API_TOKEN ='generate_api_token';
  15. publicfunctioninit ()
  16. {
  17. parent::init();
  18. $this->on(self::GET_API_TOKEN, [$this,'onGenerateApiToken']);
  19. }
  20. /**
  21. * @inheritdoc
  22. * 对客户端表单数据进行验证的rule
  23. */
  24. publicfunctionrules()
  25. {
  26. return[
  27. [['username','password'],'required'],
  28. ['password','validatePassword'],
  29. ];

相信看了本文案例你已经掌握了方法,更多精彩请关注Gxl网其它相关文章!

推荐阅读:



以上就是yii2 resetful的授权验证详解的详细内容,更多请关注Gxl网其它相关文章!

人气教程排行