场景是这样的,我用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数据库的更多相关文章

  1. Laravel项目修改时区

    Laravel项目修改时区 最近做了一个支付宝支付的应用,现在还在开发过程中,今天早上起床之后先调试了一下项目,模拟支付了一笔(¥9999.00) 2333支付宝的沙箱环境啦,屌丝程序猿哪来这么多钱- ...

  2. laravel jwt 做API 退出登录(注销) 该怎么弄? 如何让token失效

    laravel jwt 做API 退出登录(注销) 该怎么弄? 如何让token失效 php框架 laravel 2.1k 次浏览 问题对人有帮助,内容完整,我也想知道答案0问题没有实际价值,缺少关键 ...

  3. Laravel学习笔记(四)数据库 数据库迁移案例

    创建迁移 首先,让我们创建一个MySql数据库“Laravel_db”.接下来打开app/config目录下的database.php文件.请确保default键值是mysql: return arr ...

  4. Laravel 5 基础(六)- 数据库迁移(Migrations)

    database migrations 是laravel最强大的功能之一.数据库迁移可以理解为数据库的版本控制器. 在 database/migrations 目录中包含两个迁移文件,一个建立用户表, ...

  5. Laravel 下配置 Redis 让缓存、Session 各自使用不同的 Redis 数据库

    为什么要这样做? 默认情况下,Redis 服务会提供 16 个数据库,Laravel 使用数据库 0 (请见 Redis 文档)作为缓存和 Session 的存储. 在使用的过程中觉得这个默认的设置挺 ...

  6. Android黑科技,读取用户短信+修改系统短信数据库

    安卓系统比起ios系统最大的缺点,相信大家都知道,就是系统安全问题.这篇博客就秀一波“黑科技”. 读取用户短信 Android应用能读取用户手机上的短信,相信已经不是什么新鲜事,比如我们收到的短信验证 ...

  7. 一键强制修改任意Mysql数据库的密码,修改任意环境Mysql数据库。

    本文采用我软件里面的内置改密功能,可以一键强制修改Mysql数据库的密码, 在修改过程中,会强制干掉Mysql主程序,修改完成后重新启动Mysql就可以了. 首先讲解如何一键强制修改PHPWAMP自身 ...

  8. laravel项目利用twemproxy部署redis集群的完整步骤

    Twemproxy是一个代理服务器,可以通过它减少Memcached或Redis服务器所打开的连接数.下面这篇文章主要给大家介绍了关于laravel项目利用twemproxy部署redis集群的相关资 ...

  9. EF修改model自动更新数据库

    最近用MVC+EF学习时遇到修改model后而数据库没更新报错,就在网上找关于数据迁移自动更新数据库的,折腾了大半天终于弄了出来 第一步:在程序包管理器控制台里: Enable-Migrations ...

随机推荐

  1. MySQL数据库使用规范

    一.建表规约 1.[强制]表达是与否概念的字段,必须使用is_xxx的方式命名,数据类型是unsigned tinyint (1表示是,0表示否) 说明:任何字段如果为非负数,必须是unsigned ...

  2. MyCP课下作业

    任务详情 编写MyCP.java 实现类似Linux下cp XXX1 XXX2的功能,要求MyCP支持两个参数: java MyCP -tx XXX1.txt XXX2.bin 用来把文本文件(内容为 ...

  3. tomcat 常用命令 网上找的资料

    打开终端 cd /java/tomcat #执行 bin/startup.sh #启动tomcat bin/shutdown.sh #停止tomcat tail -f logs/catalina.ou ...

  4. javaScript中的redirect

    <script type="text/javascript"> <!-- window.location = "http://www.google.co ...

  5. OSPF Sham-Link配置示例

    在MPLS/VPN环境中,如果PE-CE之间使用OSPF交换路由信息,OSPF route将作为VPNv4 route(携带OSPF domain ID,OSPF Router ID,OSPF Rou ...

  6. form表单提交数据,页面必定会刷新,ajax提交数据不会刷新,做到悄悄提交,多选删除,ajax提交实例

    很多页面用到的模态对话框,如知明网站https://dig.chouti.com/的登录页都是模态对话框, 当点登录时,是用的ajax提交,因为输入错了信息,有返回消息,而页面没有刷新. jquery ...

  7. [例子]Ubuntu虚拟机设置固定IP上网

    宿主机器     win7 linux            Ubuntu 14.04 LTS 参考: Linux系列:Ubuntu虚拟机设置固定IP上网(配置IP.网关.DNS.防止resolv.c ...

  8. JRockit Mission Control建立到Tomcat的连接(windows)

    http://www.360doc.com/content/10/0928/16/203871_57086538.shtml  蓝海豹 JRockit Mission Control建立到Tomcat ...

  9. gcc ld 链接器相关知识,调试指令(程序员的自我修养----链接、装载与库)

    最近解决一个动态链接上的问题,因为以前从来没有接触过这方面的知识,所以恶补了一下,首先要了解gcc编译指令(makefile),ld链接器的选项(还有连接脚本section指定内存位置),熟悉查看连接 ...

  10. 【kubenetus】kubenetus运维

    重启K8S服务 systemctl stop kubelet systemctl stop kube-apiserver systemctl stop kube-proxy systemctl sto ...