博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
记一次laravel-jwt修改黑名单所用redis数据库
阅读量:6987 次
发布时间:2019-06-27

本文共 1596 字,大约阅读时间需要 5 分钟。

场景是这样的,我用tymon/jwt包做鉴权。jwt是自编码token,过期前想要强制失效只能将其加入黑名单中,黑名单一般用缓存存储。

但会有一个问题,若某种意外情况不小心执行了php aritsan cache:clear,那么当前使用的缓存数据库(配置文件中设置,默认config/database.php->redis->default)会被清空,而tymon/jwt包也是用default数据库的,故黑名单的token也会被一并清空。

如何在不改第三方包的前提下修改黑名单使用的redis数据库?这样token就能独占一库,不用和其他缓存数据一起混在当前使用数据库中,即使php aritsan cache:clear也不会受影响

查看源码:

Tymon\JWTAuth\Blacklist.php

 点进继续追踪,发现Storage的实现是Tymon\JWTAuth\Providers\Storage\Illuminate.php的Illuminate类。

Illuminate在构造函数中注入了一个CacheContract,即Illuminate\Contracts\Cache\Repository,这其实就是laravel的Cache缓存类,最后注入的缓存对象使用的就是config/cache/redis中指定的数据库(已经从第三方包追到框架源码了,所以我就不继续追了),我的场景下就是default

如果我们想让这个包不注入默认的Cache对象,而使用我们指定的Cache对象,我们可以用laravel的服务提供者:https://laravel-china.org/docs/laravel/5.6/providers/1360与服务容器进行上下文绑定:https://laravel-china.org/docs/laravel/5.6/container/1359#contextual-binding

在App\Providers\AppServiceProvider->register()方法中

对Tymon\JWTAuth\Providers\Storage\Illuminate注入的Illuminate\Contracts\Cache\Repository进行注册(注册为我们想要的对象):

/*** Register any application services.** @return void*/public function register(){    $this->app->when(Illuminate::class) //use Tymon\JWTAuth\Providers\Storage\Illuminate    ->needs(Repository::class)  //use Illuminate\Contracts\Cache\Repository    ->give(function () {        return app('cache')->store('jwt');    });}

即当Illuminate需要注入Repository时,注入function()闭包内返回的对象,在闭包里用store()方法指定缓存使用的缓存存储,也就是我们自定义的jwt存储(config/cache.php):

驱动使用redis,连接的数据库就是config/database.php->redis中我们自定义的jwt数据库

这样,第三方包注入依赖对象的时候,就会使用服务提供者提供的对象进行注入(我的场景里注入的就是专门jwt数据库的Cache对象),这就是laravel服务容器和服务提供者强大的地方。

转载于:https://www.cnblogs.com/SHQHDMR/p/10229001.html

你可能感兴趣的文章
ios第一天
查看>>
使用Kubeadm部署Kubernetes
查看>>
实现按钮点击事件
查看>>
第一次作业
查看>>
009 牌视图实现
查看>>
Kubernetes安装
查看>>
4、AngularJS2 数据显示
查看>>
CefSharp获取网页源码时卡住长时间没有返回结果
查看>>
刚入门Python的小伙伴,这是腾讯大牛工作中总结的爬虫经验!
查看>>
智能微型机器人可随周围环境“变身”
查看>>
Linux操作系统 MBR扇区故障了怎么办
查看>>
蛋花花介绍web开发语言选择PHP好还是java好
查看>>
Java中使用FastJSON进行对象的序列化和反序列化
查看>>
linux 无法引导系统 grub rescue>
查看>>
Java网络编程基础(一)
查看>>
在Mac版本下的IDEA中设置代码注释模版
查看>>
我的友情链接
查看>>
Ruby实现二分法查找
查看>>
OA系统报错
查看>>
JavaScript设计模式之一:面向对象的Javascript
查看>>