Laravel的Auth验证Token验证使用自定义Redis的例子
背景
项目用户量逐渐增大,接口调用次数越来越多,所以决定使用Redis存token,缓解数据库压力
调研
在config/auth.php文件中发现用户的驱动使用的是EloquentUserProvider服务提供器,然后查找EloquentUserProvider.php然后发现在vendor/laravel/framework/src/Illuminate/Auth文件下存在该文件
model=$model; $this->hasher=$hasher; } /** *Retrieveauserbytheiruniqueidentifier. * *@parammixed$identifier *@return\Illuminate\Contracts\Auth\Authenticatable|null */ publicfunctionretrieveById($identifier) { return$this->createModel()->newQuery()->find($identifier); } ... /** *Retrieveauserbythegivencredentials. * *@paramarray$credentials *@return\Illuminate\Contracts\Auth\Authenticatable|null */ publicfunctionretrieveByCredentials(array$credentials) { if(empty($credentials)){ return; } //Firstwewilladdeachcredentialelementtothequeryasawhereclause. //Thenwecanexecutethequeryand,ifwefoundauser,returnitina //EloquentUser"model"thatwillbeutilizedbytheGuardinstances. $query=$this->createModel()->newQuery(); foreach($credentialsas$key=>$value){ if(!Str::contains($key,'password')){ $query->where($key,$value); } } return$query->first(); } ... }
实现代码
因为我们是需要在当前的Auth验证基础之上添加一层Redis缓存,所以最简单的办法继承EloquentUserProvider类,重写
retrieveByCredentials方法所以我们新建RedisUserProvider.php文件
get($token); return$this->retrieveById($userId); } }
然后在AuthServiceProvider.php文件下修改如下代码
publicfunctionboot(GateContract$gate) { $this->registerPolicies($gate); //将redis注入Auth中 Auth::provider('redis',function($app,$config){ returnnewRedisUserProvider($app['hash'],$config['model']); }); }
修改config/auth.php用户的auth的驱动为redis。
后续
改完代码以后发现无法正常登录,一直提示用户或密码错误。。。然后看看了下用户认证方法是
auth('web')->once($credentials);然后看是在
Illuminate\Auth\SessionGuard文件中用到了RedisUserProvider文件中retrieveByCredentials方法中对用户进行密码验证,
于是修改RedisUserProvider文件
createModel()->newQuery(); foreach($credentialsas$key=>$value){ if(!Str::contains($key,'password')){ $query->where($key,$value); } } return$query->first(); } $token=$credentials['token']; $redis=Cache::getRedis(); $userId=$redis->get($token); return$this->retrieveById($userId); } }
然后登录成功啦!皆大欢喜!
以上这篇Laravel的Auth验证Token验证使用自定义Redis的例子就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。