当前位置:首页 > CMS教程 > 其它CMS > 列表

Laravel的Auth验证Token验证使用自定义Redis的例子

发布:smiling 来源: PHP粉丝网  添加日期:2021-12-25 16:22:32 浏览: 评论:0 

今天小编就为大家分享一篇Laravel的Auth验证Token验证使用自定义Redis的例子,具有很好的参考价值,希望对大家有所帮助,一起跟随小编过来看看吧。

背景

项目用户量逐渐增大,接口调用次数越来越多,所以决定使用Redis存token,缓解数据库压力

调研

在config/auth.php文件中发现用户的驱动使用的是EloquentUserProvider服务提供器,然后查找EloquentUserProvider.php 然后发现在vendor/laravel/framework/src/Illuminate/Auth文件下存在该文件

  1. <?php 
  2.    
  3. namespace Illuminate\Auth; 
  4.    
  5. use Illuminate\Support\Str; 
  6. use Illuminate\Contracts\Auth\UserProvider; 
  7. use Illuminate\Contracts\Hashing\Hasher as HasherContract; 
  8. use Illuminate\Contracts\Auth\Authenticatable as UserContract; 
  9.    
  10. class EloquentUserProvider implements UserProvider 
  11.  /** 
  12.   * The hasher implementation. 
  13.   * 
  14.   * @var \Illuminate\Contracts\Hashing\Hasher 
  15.   */ 
  16.  protected $hasher
  17.    
  18.  /** 
  19.   * The Eloquent user model. 
  20.   * 
  21.   * @var string 
  22.   */ 
  23.  protected $model
  24.    
  25.  /** 
  26.   * Create a new database user provider. 
  27.   * 
  28.   * @param \Illuminate\Contracts\Hashing\Hasher $hasher 
  29.   * @param string $model 
  30.   * @return void 
  31.   */ 
  32.  public function __construct(HasherContract $hasher$model
  33.  { 
  34.   $this->model = $model
  35.   $this->hasher = $hasher
  36.  } 
  37.    
  38.  /** 
  39.   * Retrieve a user by their unique identifier. 
  40.   * 
  41.   * @param mixed $identifier 
  42.   * @return \Illuminate\Contracts\Auth\Authenticatable|null 
  43.   */ 
  44.  public function retrieveById($identifier
  45.  { 
  46.   return $this->createModel()->newQuery()->find($identifier); 
  47.  } 
  48.  ... 
  49.   /** 
  50.   * Retrieve a user by the given credentials. 
  51.   * 
  52.   * @param array $credentials 
  53.   * @return \Illuminate\Contracts\Auth\Authenticatable|null 
  54.   */ 
  55.  public function retrieveByCredentials(array $credentials
  56.  { 
  57.   if (emptyempty($credentials)) { 
  58.    return
  59.   } 
  60.    
  61.   // First we will add each credential element to the query as a where clause. 
  62.   // Then we can execute the query and, if we found a user, return it in a 
  63.   // Eloquent User "model" that will be utilized by the Guard instances. 
  64.   $query = $this->createModel()->newQuery(); 
  65.    
  66.   foreach ($credentials as $key => $value) { 
  67.    if (! Str::contains($key'password')) { 
  68.     $query->where($key$value); 
  69.    } 
  70.   } 
  71.    
  72.   return $query->first(); 
  73.  } 
  74. ... 

实现代码

因为我们是需要在当前的Auth验证基础之上添加一层Redis缓存,所以最简单的办法继承EloquentUserProvider类,重写

retrieveByCredentials方法所以我们新建RedisUserProvider.php文件

  1. <?php 
  2. namespace App\Providers; 
  3.    
  4. use Illuminate\Auth\EloquentUserProvider; 
  5. use Cache; 
  6.    
  7. class RedisUserProvider extends EloquentUserProvider 
  8.    
  9.  public function __construct($hasher$model
  10.  { 
  11.   parent::__construct($hasher$model); 
  12.  } 
  13.  /** 
  14.   * Retrieve a user by the given credentials. 
  15.   * 
  16.   * @param array $credentials 
  17.   * @return \Illuminate\Contracts\Auth\Authenticatable|null 
  18.   */ 
  19.  public function retrieveByCredentials(array $credentials
  20.  { 
  21.    
  22.   if (!isset($credentials['token'])) { 
  23.    return
  24.   } 
  25.    
  26.   $token = $credentials['token']; 
  27.   $redis = Cache::getRedis(); 
  28.   $userId = $redis->get($token); 
  29.     
  30.   return $this->retrieveById($userId); 
  31.  } 

然后在AuthServiceProvider.php文件下修改如下代码

  1. public function boot(GateContract $gate
  2.  $this->registerPolicies($gate); 
  3.  
  4.  //将redis注入Auth中 
  5.  Auth::provider('redis',function($app$config){ 
  6.   return new RedisUserProvider($app['hash'], $config['model']); 
  7.  }); 

修改config/auth.php用户的auth的驱动为redis。

后续

改完代码以后发现无法正常登录,一直提示用户或密码错误。。。然后看看了下用户认证方法是

auth('web')->once($credentials);然后看是在

Illuminate\Auth\SessionGuard文件中用到了RedisUserProvider文件中retrieveByCredentials方法中对用户进行密码验证,

于是修改RedisUserProvider文件

  1. <?php 
  2. namespace App\Providers; 
  3.    
  4. use Illuminate\Auth\EloquentUserProvider; 
  5. use Illuminate\Support\Str; 
  6. use Illuminate\Contracts\Auth\Authenticatable as UserContract; 
  7. use Cache; 
  8.    
  9. class RedisUserProvider extends EloquentUserProvider 
  10.    
  11.  public function __construct($hasher$model
  12.  { 
  13.   parent::__construct($hasher$model); 
  14.  } 
  15.  /** 
  16.   * Retrieve a user by the given credentials. 
  17.   * 
  18.   * @param array $credentials 
  19.   * @return \Illuminate\Contracts\Auth\Authenticatable|null 
  20.   */ 
  21.  public function retrieveByCredentials(array $credentials
  22.  { 
  23.    
  24.   if (emptyempty($credentials)) { 
  25.    return
  26.   } 
  27.   if(isset($credentials['phone']) && isset($credentials['password'])){ 
  28.    // First we will add each credential element to the query as a where clause. 
  29.    // Then we can execute the query and, if we found a user, return it in a 
  30.    // Eloquent User "model" that will be utilized by the Guard instances. 
  31.    $query = $this->createModel()->newQuery(); 
  32.    
  33.    foreach ($credentials as $key => $value) { 
  34.     if (! Str::contains($key'password')) { 
  35.      $query->where($key$value); 
  36.     } 
  37.    } 
  38.    
  39.    return $query->first(); 
  40.   } 
  41.    
  42.   $token = $credentials['token']; 
  43.   $redis = Cache::getRedis(); 
  44.   $userId = $redis->get($token); 
  45.    
  46.   return $this->retrieveById($userId); 
  47.  } 

然后登录成功啦!皆大欢喜!

Tags: Laravel验证 Token验证 Redis

分享到: