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点,我们贴一下代码方便理解
- '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
- namespaceapi\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']);
- } //phpfensi.com
- /**
- * @inheritdoc
- * 对客户端表单数据进行验证的rule
- */
- publicfunctionrules()
- {
- return[
- [['username','password'],'required'],
- ['password','validatePassword'],
- ];
Tags: yii2 resetful 的授权验证
相关文章
- ·YII2 WIDGET的学习笔记(2016-08-25)
- ·yii2中关于加密解密的那些事儿(2018-10-17)
- ·实例:YII2框架中使用yii.js实现的post请求(2018-11-01)
推荐文章
热门文章
最新评论文章
- 写给考虑创业的年轻程序员(10)
- PHP新手上路(一)(7)
- 惹恼程序员的十件事(5)
- PHP邮件发送例子,已测试成功(5)
- 致初学者:PHP比ASP优秀的七个理由(4)
- PHP会被淘汰吗?(4)
- PHP新手上路(四)(4)
- 如何去学习PHP?(2)
- 简单入门级php分页代码(2)
- php中邮箱email 电话等格式的验证(2)