记一次laravel-jwt修改黑名单所用redis数据库
场景是这样的,我用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服务容器和服务提供者强大的地方。
记一次laravel-jwt修改黑名单所用redis数据库的更多相关文章
- Laravel项目修改时区
Laravel项目修改时区 最近做了一个支付宝支付的应用,现在还在开发过程中,今天早上起床之后先调试了一下项目,模拟支付了一笔(¥9999.00) 2333支付宝的沙箱环境啦,屌丝程序猿哪来这么多钱- ...
- laravel jwt 做API 退出登录(注销) 该怎么弄? 如何让token失效
laravel jwt 做API 退出登录(注销) 该怎么弄? 如何让token失效 php框架 laravel 2.1k 次浏览 问题对人有帮助,内容完整,我也想知道答案0问题没有实际价值,缺少关键 ...
- Laravel学习笔记(四)数据库 数据库迁移案例
创建迁移 首先,让我们创建一个MySql数据库“Laravel_db”.接下来打开app/config目录下的database.php文件.请确保default键值是mysql: return arr ...
- Laravel 5 基础(六)- 数据库迁移(Migrations)
database migrations 是laravel最强大的功能之一.数据库迁移可以理解为数据库的版本控制器. 在 database/migrations 目录中包含两个迁移文件,一个建立用户表, ...
- Laravel 下配置 Redis 让缓存、Session 各自使用不同的 Redis 数据库
为什么要这样做? 默认情况下,Redis 服务会提供 16 个数据库,Laravel 使用数据库 0 (请见 Redis 文档)作为缓存和 Session 的存储. 在使用的过程中觉得这个默认的设置挺 ...
- Android黑科技,读取用户短信+修改系统短信数据库
安卓系统比起ios系统最大的缺点,相信大家都知道,就是系统安全问题.这篇博客就秀一波“黑科技”. 读取用户短信 Android应用能读取用户手机上的短信,相信已经不是什么新鲜事,比如我们收到的短信验证 ...
- 一键强制修改任意Mysql数据库的密码,修改任意环境Mysql数据库。
本文采用我软件里面的内置改密功能,可以一键强制修改Mysql数据库的密码, 在修改过程中,会强制干掉Mysql主程序,修改完成后重新启动Mysql就可以了. 首先讲解如何一键强制修改PHPWAMP自身 ...
- laravel项目利用twemproxy部署redis集群的完整步骤
Twemproxy是一个代理服务器,可以通过它减少Memcached或Redis服务器所打开的连接数.下面这篇文章主要给大家介绍了关于laravel项目利用twemproxy部署redis集群的相关资 ...
- EF修改model自动更新数据库
最近用MVC+EF学习时遇到修改model后而数据库没更新报错,就在网上找关于数据迁移自动更新数据库的,折腾了大半天终于弄了出来 第一步:在程序包管理器控制台里: Enable-Migrations ...
随机推荐
- JavaEE基本框架(Struts2+Spring+MyBatis三层,Struts MVC)之间的关系
郭晨 软件151 1531610114 [整理]JavaEE基本框架(Struts2+Spring+MyBatis三层,Struts MVC)之间的关系 visio文件下载 概述 一个JavaEE的项 ...
- miniui的联动列表
function OnCellBeginEdit(e) { var grid = e.sender; var column = e.column; if (!column.parentfield) { ...
- 提取excel表数据成json格式的以及对图片重命名
开发那边的需求 1.功夫熊猫以及阿狸布塔故事集都是属于剧集的.意思就是有很多集,这里称他们为tv最下面这几行第一列没名字的都是单集的,这里称它们为mv需要统计所有工作表里面的数据把tv放一个大的jso ...
- MQ实战
MQ是什么? MQ(消息队列)是一种跨进程的通信机制,用于上下游传递消息. MQ的优点 异步处理,代码解藕. spring中集成MQ的实现 1. xml配置 <?xml version=&quo ...
- QQ浏览器中时区bug
在QQ浏览器 4.4.119.400 版本中,通过new Date('2018-11-11').getTime(); 获取的时间不是东8区的时间戳,而是0时区的时间戳,这就导致了获取的时间与实际的时间 ...
- layer.open弹出窗口后在子页面修改弹窗的title
在子页面修改layer.open弹窗的title,代码如下: var index = parent.layer.getFrameIndex(window.name); //先得到当前iframe层的索 ...
- zabbix 监控进程
参考资料 官方文档. 有时候某个进程挂了没有发现,直到业务中断才想起去检查.希望能有个功能在某个进程挂了以后发出告警. zabbix提供proc.num这个key对后台进程进行监控.原理很简单,其实就 ...
- 【DevExpress】邮箱制作小结
利用DevExpress的RichEditControl控件可以发送包含图片的邮件.但存在一个问题.RichEdit直接将图片解析成base64码包含在RichEdit的HtmlText中,这导致客户 ...
- OpenStack搭建Q版只属于计算节点上的环境准备(step6)
配置NTP服务 1.安装chronyd yum install chrony -y 2.修改配置文件,使计算节点与控制节点同步时间 vim /etc/chrony.conf 注释掉下面四行: #ser ...
- C语言的抽象与函数指针--思想(转)
一.何为抽象? 从小到大,我们接触到的抽象,最熟悉的莫过于数学了.为什么这样说呢? 比如说,在小学的时候,老师总是拿了几个苹果来引诱我们:同学们,这里有几个苹果啊?于是我们流着口水一个个地数,一个苹果 ...