没有 remember_token 的 Laravel 5 身份验证

Posted

技术标签:

【中文标题】没有 remember_token 的 Laravel 5 身份验证【英文标题】:Laravel 5 authentication without remember_token 【发布时间】:2017-09-14 00:09:41 【问题描述】:

我正在使用现有的数据库,并且不允许我修改表,因此添加 remember_token 不是一个选项,但没有它我无法登录。当我尝试登录时,Laravel 会检查凭据并返回它们是否与记录匹配,但它只会刷新页面。我很确定 remember_token 是原因,因为我之前遇到过这个问题,但是这次我不能在我的 users 表中添加列。

有没有办法在没有 remember_token 的情况下使用开箱即用的身份验证?

【问题讨论】:

您可以在每次刷新页面时对用户进行身份验证。 【参考方案1】:

在您的用户模型中添加:

  /**
   * Overrides the method to ignore the remember token.
   */
  public function setAttribute($key, $value)
  
    $isRememberTokenAttribute = $key == $this->getRememberTokenName();
    if (!$isRememberTokenAttribute)
    
      parent::setAttribute($key, $value);
    
  

致谢:https://laravel.io/forum/05-21-2014-how-to-disable-remember-token

【讨论】:

感谢您的快速响应,这似乎解决了记住令牌问题,但页面仍在刷新,但这是一个不同的问题。再次感谢【参考方案2】:

从 Laravel v5.3.27 开始,您还可以通过在 User 模型中将 $rememberTokenName 设置为 false 来禁用记住我的功能。

class User extends Authenticatable

    use Notifiable;


    protected $rememberTokenName = false;

    // ...

来源:this commit

【讨论】:

谢谢!我还删除了该列。然后重置密码功能坏了 Column not found: 1054 Unknown column 'remember_token' 用户尝试提交新密码时发生错误。 (希望我的评论对 SEO 有所帮助)【参考方案3】:

为了真正禁用“记住我”功能并确保没有使用 remember_token 字段,请将以下代码添加到 App\Providers\AuthServiceProvider 的启动方法中。

Auth::provider('eloquent', function($app, array $config)

  return new class($app['hash'], $config['model']) extends \Illuminate\Auth\EloquentUserProvider
  
    public function retrieveByToken($identifier, $token)
    
      return null;
    

    public function updateRememberToken(\Illuminate\Contracts\Auth\Authenticatable $user, $token)
    
      //Do nothing
    
  ;
);

假设默认的 Laravel 设置,上面的代码将立即运行。

当然,可以通过在单独的文件中定义自定义用户提供程序而不是使用匿名类来改进它。

【讨论】:

以上是关于没有 remember_token 的 Laravel 5 身份验证的主要内容,如果未能解决你的问题,请参考以下文章

将 laravel remember_token 字段更改为其他内容

remeber me即记住我功能

laravel 4.2 并记住我更新

Laravel在插入新记录时在created_at和updated_at中放置null

如何在 laravel 5.1 中实现“记住我”?

在没有nodejs的laravel中创建一个实时应用程序