Laravel的Auth验证Token验证使用自定义Redis的例子
时间:2022-07-27
本文章向大家介绍Laravel的Auth验证Token验证使用自定义Redis的例子,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
背景
项目用户量逐渐增大,接口调用次数越来越多,所以决定使用Redis存token,缓解数据库压力
调研
在config/auth.php文件中发现用户的驱动使用的是EloquentUserProvider服务提供器,然后查找EloquentUserProvider.php 然后发现在vendor/laravel/framework/src/Illuminate/Auth文件下存在该文件
<?php
namespace IlluminateAuth;
use IlluminateSupportStr;
use IlluminateContractsAuthUserProvider;
use IlluminateContractsHashingHasher as HasherContract;
use IlluminateContractsAuthAuthenticatable as UserContract;
class EloquentUserProvider implements UserProvider
{
/**
* The hasher implementation.
*
* @var IlluminateContractsHashingHasher
*/
protected $hasher;
/**
* The Eloquent user model.
*
* @var string
*/
protected $model;
/**
* Create a new database user provider.
*
* @param IlluminateContractsHashingHasher $hasher
* @param string $model
* @return void
*/
public function __construct(HasherContract $hasher, $model)
{
$this- model = $model;
$this- hasher = $hasher;
}
/**
* Retrieve a user by their unique identifier.
*
* @param mixed $identifier
* @return IlluminateContractsAuthAuthenticatable|null
*/
public function retrieveById($identifier)
{
return $this- createModel()- newQuery()- find($identifier);
}
...
/**
* Retrieve a user by the given credentials.
*
* @param array $credentials
* @return IlluminateContractsAuthAuthenticatable|null
*/
public function retrieveByCredentials(array $credentials)
{
if (empty($credentials)) {
return;
}
// First we will add each credential element to the query as a where clause.
// Then we can execute the query and, if we found a user, return it in a
// Eloquent User "model" that will be utilized by the Guard instances.
$query = $this- createModel()- newQuery();
foreach ($credentials as $key = $value) {
if (! Str::contains($key, 'password')) {
$query- where($key, $value);
}
}
return $query- first();
}
...
}
实现代码
因为我们是需要在当前的Auth验证基础之上添加一层Redis缓存,所以最简单的办法继承EloquentUserProvider类,重写
retrieveByCredentials方法所以我们新建RedisUserProvider.php文件
<?php
namespace AppProviders;
use IlluminateAuthEloquentUserProvider;
use Cache;
class RedisUserProvider extends EloquentUserProvider
{
public function __construct($hasher, $model)
{
parent::__construct($hasher, $model);
}
/**
* Retrieve a user by the given credentials.
*
* @param array $credentials
* @return IlluminateContractsAuthAuthenticatable|null
*/
public function retrieveByCredentials(array $credentials)
{
if (!isset($credentials['token'])) {
return;
}
$token = $credentials['token'];
$redis = Cache::getRedis();
$userId = $redis- get($token);
return $this- retrieveById($userId);
}
}
然后在AuthServiceProvider.php文件下修改如下代码
public function boot(GateContract $gate)
{
$this- registerPolicies($gate);
//将redis注入Auth中
Auth::provider('redis',function($app, $config){
return new RedisUserProvider($app['hash'], $config['model']);
});
}
修改config/auth.php用户的auth的驱动为redis。
后续
改完代码以后发现无法正常登录,一直提示用户或密码错误。。。然后看看了下用户认证方法是
auth('web')- once($credentials);然后看是在
IlluminateAuthSessionGuard文件中用到了RedisUserProvider文件中retrieveByCredentials方法中对用户进行密码验证,
于是修改RedisUserProvider文件
<?php
namespace AppProviders;
use IlluminateAuthEloquentUserProvider;
use IlluminateSupportStr;
use IlluminateContractsAuthAuthenticatable as UserContract;
use Cache;
class RedisUserProvider extends EloquentUserProvider
{
public function __construct($hasher, $model)
{
parent::__construct($hasher, $model);
}
/**
* Retrieve a user by the given credentials.
*
* @param array $credentials
* @return IlluminateContractsAuthAuthenticatable|null
*/
public function retrieveByCredentials(array $credentials)
{
if (empty($credentials)) {
return;
}
if(isset($credentials['phone']) && isset($credentials['password'])){
// First we will add each credential element to the query as a where clause.
// Then we can execute the query and, if we found a user, return it in a
// Eloquent User "model" that will be utilized by the Guard instances.
$query = $this- createModel()- newQuery();
foreach ($credentials as $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的例子就是小编分享给大家的全部内容了,希望能给大家一个参考。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Linux系列之下载安装jdk-8u261-linux-i586.tar.gz
- 常见网页特效案例
- MySQL系列之体系结构原理学习笔记
- 触屏事件
- 10.2【前端开发】图片文件格式:常见的图片格式对比有何优劣以及如何使用Google的webp格式?
- uni-app 与 Vue H5 项目通讯
- Gridview][UpdateCommand的写法要点]
- MySQL系列之事务日志Undo log学习笔记
- click 延时解决方案
- Splash抓取javaScript动态渲染页面
- Sentence-Transformer的使用及fine-tune教程
- MySQL系列之事务日志Redo log学习笔记
- jQuery 的基本使用
- uni-app项目改用vue-cli npm运行报错及问题总汇
- 10.3【前端开发】背景图片:如何使用精灵图?