Laravel Passport OAuth 数据库查询改缓存优化

1、oauth_clients 表查询缓存修改

-- 找到路径 project/vendor/laravel/passport/src/Client.php 文件
注释该行代码,不然查询出来存缓存无法获取 secret 值

Laravel Passport Oauth 数据库查询改缓存优化

-- 找到路径 project/vendor/laravel/passport/src/ClientRepository.php 文件,修改 find () 方法,将第一次查询结果存入缓存,后校验 client_id 及 client_secret 直接查询缓存。
<注意:如果经常修改 client_secret ,请记得修改此文件中的 update () 方法,修改完成后删除指定缓存数据 >

Laravel Passport Oauth 数据库查询改缓存优化

2、oauth_access_tokens 表插入查询优化

-- 找到路径为 project/vendor/laravel/passport/src/TokenRepository.php 文件,修改 create () 方法,将写入数据库的数据存入 token_id=>attributes 的键值对缓存,将 attributes 数据写入 redis 队列(通过任定时任务异步写入数据库);修改 find () 方法,直接通过 token_id 查询缓存是否存在(这里的缓存过期时间可以直接设置为 token 的有效期时间,就不需要查询数据库了)

Laravel Passport Oauth 数据库查询改缓存优化

3、oauth_refresh_tokens 表操作优化

-- 找到路径为 project/vendor/laravel/passport/src/Bridge/RefreshTokenRepository.php 文件,修改 persistNewRefreshToken () 方法,将直接插入 oauth_refresh_tokens 表的数据写入 redis 队列,后台定时任务异步入库(因 refresh_token 有效期设置一般较长及使用频率不高,故查询 refresh_token 未做缓存优化,如果需要也只是多存一组 String 类型的缓存数据,修改 persistNewRefreshToken () 方法存 key=>value 缓存,修改 isRefreshTokenRevoked () 方法查询缓存即可)

Laravel Passport Oauth 数据库查询改缓存优化

4、token 校验优化

-- 另外还可以修改文件
project/vendor/league/oauth2-server/src/AuthorizationValidators/BearerTokenValidator.php 中的 validateAuthorization () 方法,直接查询对应 token_id 的缓存是否存在来校验 token 的有效性

Laravel Passport Oauth 数据库查询改缓存优化

Laravel Passport Oauth 数据库查询改缓存优化

5、异步写库

Laravel Passport OAuth 数据库查询改缓存优化

Laravel Passport OAuth 数据库查询改缓存优化

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 4
Explorer

passport 虽然是好用,但是高并发场景下实时操作数据库是真的有性能瓶颈,所以只能通过缓存来做优化

5年前 评论

说实话,当我看到要改 vendor 里面的代码的时候,我就没往下看的欲望了

5年前 评论
Explorer (楼主) 5年前
jamesZhao 5年前

ClientRepository.php 文件中修改 find 方法,中 Cache::put ($cache_key, json_encode ($result), Carbon::now ()->addDays (1)); 保存的数据不完整 :joy:这个是什么问题啊,

file

5年前 评论
Explorer (楼主) 5年前
HKer_YM (作者) 5年前
HKer_YM (作者) 5年前
HKer_YM (作者) 5年前
HKer_YM (作者) 5年前
  1. 新增 ClientRepository 类 继承于 Laravel\Passport\ClientRepository

  2. 新增 TokenRepository 类 继承于 Laravel\Passport\TokenRepository

  3. App\Providers 中新建一个 PassportServiceProvider 继承于 Laravel\Passport\PassportServiceProvider

  4. 重写 registerClientRepository 方法
    绑定新增的 ClientRepository 类

  5. 新增一个 registerTokenRepository 方法
    绑定新增的 ```TokenRepository 类``

  6. 重写 register 方法

     /**
      * Register the service provider.
      *
      * @return void
      */
     public function register()
     {
         $this->registerTokenRepository();
    
         parent::register();
     }

后面的事情,你该干嘛干嘛。只需要在 新增 ClientRepository 类 TokenRepository 类 去重写 find($id) 方法 实现你自己的缓存方式即可

4年前 评论