YII2的restfulAPI开发入门(3)-账户验证和速率控制

1. 几个Controller之间关系的说明

⑴ 不需要进行认证

ApiController

UserController extends ApiController

⑵ 需要进行认证

AuthApiController extends ApiController

AuthuserController extends AuthApiController

2. 只有安全认证过的api才可执行账户验证和速率控制。

⑴ AuthApiController.php

<?php

namespace app\controllers;

use yii;

use yii\filters\auth\QueryParamAuth;

use yii\filters\RateLimiter;

use app\models\User;

class AuthApiController extends ApiController{

/**

* 并添加token验证

* {@inheritDoc}

* @see \yii\rest\Controller::behaviors()

*/

public function behaviors()

{

$behaviors=parent::behaviors();

$behaviors[‘authenticator‘][‘class‘]=QueryParamAuth::className();

$behaviors[‘rateLimiter‘][‘class‘]=RateLimiter::className();

$behaviors[‘rateLimiter‘][‘enableRateLimitHeaders‘] =true;

return $behaviors;

}

/**

* checkUsernameAndToken:

* 1. check token 是否 empty

* 2. username是否empty,是否符合正则规则

* checkTokenByUser:

* user表中是否存在符合条件的记录: username, accesstoken

*/

public function checkTokenUsername(){

$token=yii::$app->request->get(‘accesstoken‘);

$username=yii::$app->request->post(‘username‘);

//检查username,token在user表中是否存在

$userInfo=User::checkTokenByUser($token, $username);

if(false==$userInfo){

return [‘error‘, ‘operationIllegal‘];

}

return $userInfo;

}

}

⑵ AuthuserController.php

<?php

namespace  app\controllers;

use yii;

use app\models\User;

class AuthuserController extends AuthApiController {

// 用户中心

public $modelClass = ‘app\models\User‘;

/**

* 过滤数据接收方式

* {@inheritDoc}

* @see \yii\rest\ActiveController::verbs()

*/

protected function verbs(){

return [

‘getuserinfo‘=>[‘get‘,‘post‘],

];

}

/**

* 获取个人信息

*/

public function actionGetuserinfo(){

$userInfo = $this->checkTokenUsername();

if(isset ($userInfo[‘error‘]))

return [‘error’=>’nouser’];

return $userInfo;

}

}

⑶ 最重要的User.php

<?php

namespace app\models;

use Yii;

use app\components\Utility;

use yii\web\IdentityInterface;

use yii\filters\RateLimitInterface;

class User extends \yii\db\ActiveRecord implements IdentityInterface, RateLimitInterface

{

/**

* @inheritdoc

*/

public static function tableName()

{

return ‘{{%user}}‘;

}

/**

* @inheritdoc

*/

public function rules()

{

return [

[[‘username‘, ‘password‘], ‘required‘],

[[‘status‘, ‘addtime‘, ‘logins‘, ‘allowance‘, ‘allowance_updated_at‘], ‘integer‘],

[[‘username‘, ‘password‘, ‘email‘], ‘string‘, ‘max‘ => 64],

[[‘mobile‘], ‘string‘, ‘max‘ => 11],

[[‘last_login_ip‘], ‘string‘, ‘max‘ => 15],

[[‘access_token‘], ‘string‘, ‘max‘ => 32],

[[‘access_token‘], ‘unique‘]

];

}

/**

* @inheritdoc

*/

public function attributeLabels()

{

return [

‘uid‘ => ‘Uid‘,

‘username‘ => ‘Username‘,

‘password‘ => ‘Password‘,

‘email‘ => ‘Email‘,

‘status‘ => ‘Status‘,

‘addtime‘ => ‘Addtime‘,

‘mobile‘ => ‘Mobile‘,

‘last_login_ip‘ => ‘Last Login Ip‘,

‘logins‘ => ‘Logins‘,

‘access_token‘ => ‘Access Token‘,

‘allowance‘ => ‘Allowance‘,

‘allowance_updated_at‘ => ‘Allowance Updated At‘,

];

}

/**

* @inheritdoc

* @return UserQuery the active query used by this AR class.

*/

public static function find()

{

return new UserQuery(get_called_class());

}

/**

* 授权认证. IdentityInterface

*/

public static function findIdentityByAccessToken($token, $type = null) {

return static::findOne([‘access_token‘ => $token]);

}

public static function findIdentity($id) {

return static::findOne([‘uid‘ => $id]);

}

public function getId() {

return $this->uid;

}

public function getAuthKey() { }

public function validateAuthKey($authKey) { }

/**

* 限速部分. RateLimitInterface

*/

public function getRateLimit($request, $action) {

return [3,6]; // 6秒3次

}

public function loadAllowance($request, $action){

return [$this->allowance,$this->allowance_updated_at];

}

public function saveAllowance($request, $action, $allowance, $timestamp){

$this->allowance=$allowance;

$this->allowance_updated_at=$timestamp;

$this->save();

}

/**

* 检查token跟用户名(手机或者邮箱)是否对应

*/

public static function checkTokenByUser($token, $user) {

$userInfo = self::findByUsername($user);

return ((!!$userInfo) && ($userInfo->access_token == $token)) ? $userInfo : false;

}

/**

* 通过username查找一个用户

*/

public static function findByUsername($username){

if(empty($username)) return false;

$sqlstr = "select * from ".self::tableName()." where username=$username";

$userInfo = self::findBySql($sqlstr)->one();

return empty($userInfo) ? false : $userInfo;

}

}

3. 测试

⑴ 账户验证

① 当access-token在yii2_user表中不存在时,报错:You are requesting with an invalid credential.

⑵ 速率控制

① Headers下的信息:

② Body返回的信息:

时间: 2024-07-31 14:31:11

YII2的restfulAPI开发入门(3)-账户验证和速率控制的相关文章

YII2的restfulAPI开发入门(1)-环境搭建

1. 准备工作 Web server: apache 或者 nginx Yii2版本: basic版本 数据库: mysql 2. 访问Yii2的web目录 ⑴ 测试Yii2环境 web/目录下创建info.php文件,文件代码为:echo phpinfo(); 输入 127.0.0.1/info.php后就能访问到 /web/info.php. 说明Yii2环境搭建成功. 3. 参数配置 ⑴ web.php (1.1) 'cookieValidationKey' => '2e268962384

YII2的restfulAPI开发入门(2)-第1个restfulAPI

1. ApiController.php <?php namespace app\controllers; use yii\web\Response; use yii\rest\ActiveController; class ApiController extends ActiveController{ /** * 将返回的数据设置成JSON格式 * {@inheritDoc} * @see \yii\rest\Controller::behaviors() */ public function

YII2的restfulAPI开发入门(4)-几个问题

现在看我整理好的文档,一步步调试restful API,感觉非常简单,但当时在局中的我,确实碰到了不少麻烦事,而且网上也没标志的文档,都是自己网上找,自己实战,看源代码的方式折腾出来的.总体感觉,用Yii2写restful API还是蛮方便的. 1. 为了access-token参数能兼容nginx下的lua语言开发restful API,把access-token参数修改成accesstoken. 同时,Yii2.0框架下的: vendor/yiisoft/yii2/filters/auth/

ENVI Services Engine5.1 应用开发入门教程

原文地址: ENVI Services Engine5.1 应用开发入门教程_ENVI-IDL中国_新浪博客 http://blog.sina.com.cn/s/blog_764b1e9d0102uyet.html   入门教程及示例程序下载:http://pan.baidu.com/s/1kT0vAT5 目录 一.安装 1.1 软硬件要求 1.2 安装须知 1.3 产品安装 二.服务器端开发 2.1 任务创建 2.2 ENVI/IDL程序开发 2.3 JSON配置文件编辑 2.4 任务发布及管

微信公众号开发入门心得(一)

一.前言 为了快速了解微信公众号开发过程,我选择了php语言来进行微信公众号开发,选择php的原因有两点,一是网上有很多用php开放微信公众号的教程,可以减少学习成本:二是php也比较容易学习,学习门槛低. 学习php开发微信公众号,开发者需要有一点php基础.对于学过其他编程语言的童鞋,了解一些基本的php语法就可以开始了.我的 PHP基础学习笔记(一) 二.微信公众号开发的步骤 三.微信公众号开发步骤详解   + 微信公众号开发入门可以参考 微信公众平台开发入门教程 教程中用的新浪云做的服务

微信公众平台开发入门教程

在这篇微信公众平台开发教程中,我们假定你已经有了PHP语言程序.MySQL数据库.计算机网络通讯.及HTTP/XML/CSS/JS等基础. 我们将使用微信公众账号方倍工作室作为讲解的例子,二维码见底部. 本系列教程将引导你完成如下任务: 创建新浪云计算平台应用 启用微信公众平台开发模式 基础接口消息及事件 微信公众平台PHP SDK 微信公众平台开发模式原理 开发天气预报功能 第一章 申请服务器资源 创建新浪云计算应用 申请账号 我们使用SAE新浪云计算平台作为服务器资源,并且申请PHP环境+M

Mysql 与 php动态网站开发 入门教程

这个系列的教程由表单开始写,因为表单可以把数据库和web 之间的交互表现得很明显.提交表单 ,数据库记录注册信息. 本教程属于基础教程.大神请略过. 对于php和mysql之间的稳固性很受程序员的喜爱.虽说最近出现了hack语言准备替代php语言,但是这个语言本身也是基于php的,后面我们可以对hack语言进行一定得学习. 好像博客园有好多大牛,不知道会不会被喷,好怕 ........当然,我是借着自己学习的这股劲,把学习的过程也给记录下来.教程涉及  html 表单 简单的php 和mysql

SharePoint 2013开发入门探索(二)- 列表操作

我们如何用代码对SharePoint列表做些例如增删改查的操作呢?如果您的程序可以部署到服务器上,就可以使用 服务器对象模型,因为服务器对象模型提供的功能最多,限制最少:否则可能要选择客户对象模型等其他方式,这可能会遇到一些功能限制:另外还有一些其他的访问方式,例如Web服务等.如何在 SharePoint 2013 中选择正确的 API 集请参考链接 http://msdn.microsoft.com/zh-cn/library/jj164060.aspx. 我们首先研究下服务器对象模型.使用

ArcGIS API for Silverlight/ 开发入门 环境搭建

Silverlight/ 开发入门 环境搭建1 Silverlight SDK下载ArcGIS API for Microsoft Silverlight/WPF ,需要注册一个ESRI Gloab 账户.下载地址http://resources.esri.com/arcgisserver/apis/silverlight/2 开发环境:1)Visual Studio 2008 SP1 或者 Visual Web Developer Express with SP1 下载地址 :Visual S