免费与付费用户隔离:SaaS应用Laravel分层限流实战【商业化】

秋瑶同学_7009

秋瑶同学_7009

2026-08-06

325人浏览

原创

saas应用需按租户订阅等级动态限流:免费用户严格限制,付费用户高并发保障。通过identifysubscriptiontier中间件获取tier并存入请求属性,throttlebysubscriptiontier或redis原生命令实现分级限流,敏感接口需双重校验与三层拦截。

免费与付费用户隔离:saas应用laravel分层限流实战【商业化】

在SaaS应用中为免费用户设置严格请求频次限制、同时保障付费用户高并发访问不被阻塞,是商业化落地的关键技术动作。直接在全局中间件里硬编码限流阈值会导致逻辑耦合、无法动态调整,且容易因租户类型识别错误导致付费用户被误限。

识别当前用户所属商业等级

在请求进入业务逻辑前,必须准确判断该用户是免费版、基础版还是企业版。Tenancy for Laravel 已自动加载租户上下文,但商业等级需从租户配置表读取,而非仅依赖用户角色。

在 app/Http/Middleware/IdentifySubscriptionTier.php 中新增中间件:

调用 Tenant::current()->subscription->tier 获取当前租户的 tier 字段值;该字段应预先存入 tenants 表或独立 subscription 表,不可通过 User 模型反查——【User 属于多个租户时,单个 User 记录无法代表当前请求所处的租户商业等级】

将 tier 值写入 request()->attributes->set('subscription_tier', $tier) 供后续中间件使用。

按 tier 动态配置限流参数

方法一:基于 Laravel 内置 ThrottleRequests 中间件扩展

新建 app/Http/Middleware/ThrottleBySubscriptionTier.php,继承 Illuminate\Routing\Middleware\ThrottleRequests;重写 resolveRequestSignature() 方法,返回 tenant_id + subscription_tier 的组合键,避免不同租户同 tier 之间共享计数器。

在 handle() 中根据 $request->attributes->get('subscription_tier') 查表获取对应限流规则:免费版 60 次/小时,基础版 1200 次/小时,企业版 10000 次/小时;调用 parent::handle() 时传入动态计算出的 $maxAttempts 和 $decaySeconds。

Laravel
Laravel

避免常见的Laravel错误:N+1查询、批量赋值、缓存陷阱及队列序列化陷阱。

下载

方法二:使用 Redis 原生命令自定义限流(推荐)

在中间件中构造 Redis key:"throttle:{$tenantId}:{$tier}";执行 INCR + EXPIRE 原子操作;若返回值 > 阈值则 throw new ThrottleRequestsException();此方式绕过 Laravel 默认的 file 缓存驱动,避免多机部署时计数不一致。

注意:不要用 $request->ip() 作为限流维度——【SaaS 前端通常走 CDN 或反向代理,真实 IP 已被覆盖,应以 tenant_id 为唯一计量单位】

对敏感接口实施双重限流

第一步:在路由定义中对 /api/v1/export、/api/v1/ai/generate 等高消耗接口显式绑定限流中间件:

Route::middleware(['throttle.by.tier', 'throttle.sensitive'])->group(function () { ... });

第二步:编写 throttle.sensitive 中间件,在其中对当前租户 tier 进行二次校验——若为免费用户,强制将每分钟上限压至 3 次,并拒绝携带 ?format=csv 的导出请求;该层拦截发生在业务逻辑前,防止无效请求进入模型层。

第三步:在 ExportController@handle 中再次检查 request()->attributes->get('subscription_tier') 是否为企业版;不是则直接 abort(403),不执行任何数据库查询或文件生成操作。

这一步操作起来很简单,直接把 abort(403) 放在最前面就行。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

2023.09.01

8964

6

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.11

5461

5

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.11

1995

5

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

2023.10.23

3368

4

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

2023.10.23

4054

6

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.03

3171

9

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.09

4497

8

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.13

3502

8

sprintf函数用法详解
sprintf函数用法详解

sprintf函数的用法:1、格式化字符串;2、指定输出宽度和精度;3、返回值。更多关于sprintf函数用法详解的内容,大家可以阅读下面的文章。

2023.11.27

11562

4

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
如何安装 Composer
如何安装 Composer

共1课时 | 176人学习

Composer手册
Composer手册

共0课时 | 0人学习