千家信息网

Yii2框架RESTfulAPI中格式化响应和授权认证以及速率限制的示例分析

发表于:2024-11-23 作者:千家信息网编辑
千家信息网最后更新 2024年11月23日,这篇文章将为大家详细讲解有关Yii2框架RESTfulAPI中格式化响应和授权认证以及速率限制的示例分析,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。
千家信息网最后更新 2024年11月23日Yii2框架RESTfulAPI中格式化响应和授权认证以及速率限制的示例分析

这篇文章将为大家详细讲解有关Yii2框架RESTfulAPI中格式化响应和授权认证以及速率限制的示例分析,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

一、目录结构

先列出需要改动的文件。目录如下:

web├─ common│ └─ models │ └ User.php└─ frontend├─ config│ └ main.php└─ controllers└ BookController.php

二、格式化响应

Yii2 RESTful支持JSON和XML格式,如果想指定返回数据的格式,需要配置yii\filters\ContentNegotiator::formats属性。例如,要返回JSON格式,修改frontend/controllers/BookController.php,加入红色标记代码:

namespace frontend\controllers;use yii\rest\ActiveController;use yii\web\Response;class BookController extends ActiveController{public $modelClass = 'frontend\models\Book';public function behaviors() {$behaviors = parent::behaviors();$behaviors['contentNegotiator']['formats']['text/html'] = Response::FORMAT_JSON;return $behaviors;}}

返回XML格式:FORMAT_XML。formats属性的keys支持MIME类型,而values必须在yii\web\Response::formatters中支持被响应格式名称。

三、授权认证

RESTful APIs通常是无状态的,因此每个请求应附带某种授权凭证,即每个请求都发送一个access token来认证用户。

1.配置user应用组件(不是必要的,但是推荐配置):

  设置yii\web\User::enableSession属性为false(因为RESTful APIs为无状态的,当yii\web\User::enableSession为false,请求中的用户认证状态就不能通过session来保持)

  设置yii\web\User::loginUrl属性为null(显示一个HTTP 403 错误而不是跳转到登录界面)

具体方法,修改frontend/config/main.php,加入红色标记代码:

'components' => [...'user' => ['identityClass' => 'common\models\User','enableAutoLogin' => true,'enableSession' => false,'loginUrl' => null,],...]

2.在控制器类中配置authenticator行为来指定使用哪种认证方式,修改frontend/controllers/BookController.php,加入红色标记代码:

namespace frontend\controllers;use yii\rest\ActiveController;use yii\web\Response;use yii\filters\auth\CompositeAuth;use yii\filters\auth\QueryParamAuth;class BookController extends ActiveController{public $modelClass = 'frontend\models\Book';public function behaviors() {$behaviors = parent::behaviors();$behaviors['authenticator'] = ['class' => CompositeAuth::className(),'authMethods' => [/*下面是三种验证access_token方式*///1.HTTP 基本认证: access token 当作用户名发送,应用在access token可安全存在API使用端的场景,例如,API使用端是运行在一台服务器上的程序。//HttpBasicAuth::className(),//2.OAuth 2: 使用者从认证服务器上获取基于OAuth3协议的access token,然后通过 HTTP Bearer Tokens 发送到API 服务器。//HttpBearerAuth::className(),//3.请求参数: access token 当作API URL请求参数发送,这种方式应主要用于JSONP请求,因为它不能使用HTTP头来发送access token//http://localhost/user/index/index?access-token=123QueryParamAuth::className(),],];$behaviors['contentNegotiator']['formats']['text/html'] = Response::FORMAT_JSON;return $behaviors;}}

3.创建一张user表

-- ------------------------------ Table structure for user-- ----------------------------DROP TABLE IF EXISTS `user`;CREATE TABLE `user` (`id` int(10) unsigned NOT NULL AUTO_INCREMENT,`username` varchar(20) NOT NULL DEFAULT '' COMMENT '用户名',`password_hash` varchar(100) NOT NULL DEFAULT '' COMMENT '密码',`password_reset_token` varchar(50) NOT NULL DEFAULT '' COMMENT '密码token',`email` varchar(20) NOT NULL DEFAULT '' COMMENT '邮箱',`auth_key` varchar(50) NOT NULL DEFAULT '',`status` tinyint(3) unsigned NOT NULL DEFAULT '0' COMMENT '状态',`created_at` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '创建时间',`updated_at` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '更新时间',`access_token` varchar(50) NOT NULL DEFAULT '' COMMENT 'restful请求token',`allowance` int(10) unsigned NOT NULL DEFAULT '0' COMMENT 'restful剩余的允许的请求数',`allowance_updated_at` int(10) unsigned NOT NULL DEFAULT '0' COMMENT 'restful请求的UNIX时间戳数',PRIMARY KEY (`id`),UNIQUE KEY `username` (`username`),UNIQUE KEY `access_token` (`access_token`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;-- ------------------------------ Records of user-- ----------------------------INSERT INTO `user` VALUES ('1', 'admin', '$2y$13$1KWwchqGvxDeORDt5pRW.OJarf06PjNYxe2vEGVs7e5amD3wnEX.i', '', '', 'z3sM2KZvXdk6mNXXrz25D3JoZlGXoJMC', '10', '1478686493', '1478686493', '123', '4', '1478686493');

在common/models/User.php类中实现 yii\web\IdentityInterface::findIdentityByAccessToken()方法。修改common/models/User.php,加入红色标记代码::

public static function findIdentityByAccessToken($token, $type = null){//findIdentityByAccessToken()方法的实现是系统定义的//例如,一个简单的场景,当每个用户只有一个access token, 可存储access token 到user表的access_token列中, 方法可在User类中简单实现,如下所示:return static::findOne(['access_token' => $token]);//throw new NotSupportedException('"findIdentityByAccessToken" is not implemented.');}

四、速率限制

为防止滥用,可以增加速率限制。例如,限制每个用户的API的使用是在60秒内最多10次的API调用,如果一个用户同一个时间段内太多的请求被接收,将返回响应状态代码 429 (这意味着过多的请求)。

1.Yii会自动使用yii\filters\RateLimiter为yii\rest\Controller配置一个行为过滤器来执行速率限制检查。如果速度超出限制,该速率限制器将抛出一个yii\web\TooManyRequestsHttpException。

修改frontend/controllers/BookController.php,加入红色标记代码:

namespace frontend\controllers;use yii\rest\ActiveController;use yii\web\Response;use yii\filters\auth\CompositeAuth;use yii\filters\auth\QueryParamAuth;use yii\filters\RateLimiter;class BookController extends ActiveController{public $modelClass = 'frontend\models\Book';public function behaviors() {$behaviors = parent::behaviors();$behaviors['rateLimiter'] = ['class' => RateLimiter::className(),'enableRateLimitHeaders' => true,];$behaviors['authenticator'] = ['class' => CompositeAuth::className(),'authMethods' => [/*下面是三种验证access_token方式*///1.HTTP 基本认证: access token 当作用户名发送,应用在access token可安全存在API使用端的场景,例如,API使用端是运行在一台服务器上的程序。//HttpBasicAuth::className(),//2.OAuth 2: 使用者从认证服务器上获取基于OAuth3协议的access token,然后通过 HTTP Bearer Tokens 发送到API 服务器。//HttpBearerAuth::className(),//3.请求参数: access token 当作API URL请求参数发送,这种方式应主要用于JSONP请求,因为它不能使用HTTP头来发送access token//http://localhost/user/index/index?access-token=123QueryParamAuth::className(),],];$behaviors['contentNegotiator']['formats']['text/html'] = Response::FORMAT_JSON;return $behaviors;}}

2.在user表中使用两列来记录容差和时间戳信息。为了提高性能,可以考虑使用缓存或NoSQL存储这些信息。

修改common/models/User.php,加入红色标记代码:

namespace common\models;use Yii;use yii\base\NotSupportedException;use yii\behaviors\TimestampBehavior;use yii\db\ActiveRecord;use yii\web\IdentityInterface;use yii\filters\RateLimitInterface;class User extends ActiveRecord implements IdentityInterface, RateLimitInterface{....// 返回在单位时间内允许的请求的最大数目,例如,[10, 60] 表示在60秒内最多请求10次。public function getRateLimit($request, $action){return [5, 10];}// 返回剩余的允许的请求数。public function loadAllowance($request, $action){return [$this->allowance, $this->allowance_updated_at];}// 保存请求时的UNIX时间戳。public function saveAllowance($request, $action, $allowance, $timestamp){$this->allowance = $allowance;$this->allowance_updated_at = $timestamp;$this->save();}....public static function findIdentityByAccessToken($token, $type = null){//throw new NotSupportedException('"findIdentityByAccessToken" is not implemented.');//findIdentityByAccessToken()方法的实现是系统定义的//例如,一个简单的场景,当每个用户只有一个access token, 可存储access token 到user表的access_token列中, 方法可在User类中简单实现,如下所示:return static::findOne(['access_token' => $token]);}....}

关于Yii2框架RESTfulAPI中格式化响应和授权认证以及速率限制的示例分析就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

认证 用户 格式 限制 代码 时间 速率 方法 服务器 标记 红色 服务 方式 状态 配置 参数 场景 属性 用户名 存储 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 刀塔传奇 服务器 南大通用gbase数据库 生活中预防网络安全 常州网络安全宣传周开幕 关于国家网络安全漫画 更新数据库表空间满错误 大连锦程物流网络技术 高端装备嵌入式软件开发 长宁区项目网络技术怎么样 今日头条的数据库在哪里 江苏华为服务器虚拟化费用 数据库体系结构缩写 人大复印资料全文数据库 小白测评数据库20款应用 长春网络安全技术提升要怎么学 隧道管理系统数据库类型 网络安全意识薄弱的案例 济宁软件开发培训教学哪里好 网络安全手抄报语言怎么写 深圳博世汽车软件开发 国内软件开发设计专业好学校 网络安全岗位培训情况书 网络安全法与经济法的关系 网络安全在行动的心得体会 怎么把域名和服务器连接起来啊 艾泽拉斯大陆数据库 北京机电软件开发批发 极自然网络技术 网络安全防疫工作方案 西藏人口管理软件开发
0