记一次laravel-jwt修改黑名单所用redis数据库
場(chǎng)景是這樣的,我用tymon/jwt包做鑒權(quán)。jwt是自編碼token,過(guò)期前想要強(qiáng)制失效只能將其加入黑名單中,黑名單一般用緩存存儲(chǔ)。
但會(huì)有一個(gè)問(wèn)題,若某種意外情況不小心執(zhí)行了php aritsan cache:clear,那么當(dāng)前使用的緩存數(shù)據(jù)庫(kù)(配置文件中設(shè)置,默認(rèn)config/database.php->redis->default)會(huì)被清空,而tymon/jwt包也是用default數(shù)據(jù)庫(kù)的,故黑名單的token也會(huì)被一并清空。
如何在不改第三方包的前提下修改黑名單使用的redis數(shù)據(jù)庫(kù)?這樣token就能獨(dú)占一庫(kù),不用和其他緩存數(shù)據(jù)一起混在當(dāng)前使用數(shù)據(jù)庫(kù)中,即使php aritsan cache:clear也不會(huì)受影響
查看源碼:
Tymon\JWTAuth\Blacklist.php
?點(diǎn)進(jìn)繼續(xù)追蹤,發(fā)現(xiàn)Storage的實(shí)現(xiàn)是Tymon\JWTAuth\Providers\Storage\Illuminate.php的Illuminate類。
Illuminate在構(gòu)造函數(shù)中注入了一個(gè)CacheContract,即Illuminate\Contracts\Cache\Repository,這其實(shí)就是laravel的Cache緩存類,最后注入的緩存對(duì)象使用的就是config/cache/redis中指定的數(shù)據(jù)庫(kù)(已經(jīng)從第三方包追到框架源碼了,所以我就不繼續(xù)追了),我的場(chǎng)景下就是default
如果我們想讓這個(gè)包不注入默認(rèn)的Cache對(duì)象,而使用我們指定的Cache對(duì)象,我們可以用laravel的服務(wù)提供者:https://laravel-china.org/docs/laravel/5.6/providers/1360與服務(wù)容器進(jìn)行上下文綁定:https://laravel-china.org/docs/laravel/5.6/container/1359#contextual-binding
在App\Providers\AppServiceProvider->register()方法中
對(duì)Tymon\JWTAuth\Providers\Storage\Illuminate注入的Illuminate\Contracts\Cache\Repository進(jìn)行注冊(cè)(注冊(cè)為我們想要的對(duì)象):
/** * 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');}); }即當(dāng)Illuminate需要注入Repository時(shí),注入function()閉包內(nèi)返回的對(duì)象,在閉包里用store()方法指定緩存使用的緩存存儲(chǔ),也就是我們自定義的jwt存儲(chǔ)(config/cache.php):
驅(qū)動(dòng)使用redis,連接的數(shù)據(jù)庫(kù)就是config/database.php->redis中我們自定義的jwt數(shù)據(jù)庫(kù)
這樣,第三方包注入依賴對(duì)象的時(shí)候,就會(huì)使用服務(wù)提供者提供的對(duì)象進(jìn)行注入(我的場(chǎng)景里注入的就是專門(mén)jwt數(shù)據(jù)庫(kù)的Cache對(duì)象),這就是laravel服務(wù)容器和服務(wù)提供者強(qiáng)大的地方。
轉(zhuǎn)載于:https://www.cnblogs.com/SHQHDMR/p/10229001.html
總結(jié)
以上是生活随笔為你收集整理的记一次laravel-jwt修改黑名单所用redis数据库的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 一个前端在校生的2018年终总结
- 下一篇: Redis高级特性及优化