Laravel中的默认remember_me标记太长

时间:2017-06-08 12:52:20

标签: laravel-5.4

TL; DR我如何使用自己的方式生成remember_me令牌?

我有一个没有任何框架的旧网站,我已经获得了在Laravel(5.4.23)中重写它的工作。 DB是不可触及的,不能重构,不能以任何方式修改。

我能够使用不同的用户模型自定义Laravel身份验证过程,该模型反映旧数据库。但是当谈到"记住我"功能,我的令牌长度有问题。

旧网站已使用"记住我"功能,但其DB字段已定义为BINARY(25)。 SessionGuard类生成的令牌长度为60个字符。

我的第一次尝试是在将令牌写入数据库之前尝试找到缩短令牌的方法,并在从数据库中读取后再次展开令牌。我无法找到这样的方式(我甚至不确定是否有这样的方式)。

然后我开始编写自己的守护来覆盖cycleRememberToken(生成令牌的地方)。我认为我无法使其工作,因为SessionGuard类实际上是在几个地方实例化的(而不是基于配置实例化一个类)。

所以,我被卡住了。我需要一个缩短的令牌,我不知道如何获得它。

1 个答案:

答案 0 :(得分:1)

好吧,我一度走在正确的轨道上。

我必须创建自己的守卫,注册并使用它。当我第一次尝试时,我的问题是我没有以正确的方式注册它。无论如何,这就是我所做的。

我在AuthServiceProvides

中添加了以下内容
Auth::extend('mysession', function ($app, $name, array $config) {
  $provider = Auth::createUserProvider($config['provider']);

  $guard = new MyGuard('lrb', $provider, app()->make('session.store'));

  $guard->setCookieJar($this->app['cookie']);
  $guard->setDispatcher($this->app['events']);
  $guard->setRequest($this->app->refresh('request', $guard, 'setRequest'));

  return $guard;
});

我将config/auth.php中的后卫更改为

'guards' => [
    'web' => [
        'driver' => 'mysession',
        'provider' => 'users',
    ],

    'api' => [
        'driver' => 'token',
        'provider' => 'users',
    ],
],

最后是我的新警卫

class MyGuard extends SessionGuard implements StatefulGuard, SupportsBasicAuth
{
    /**
     * @inheritdoc
     */
    protected function cycleRememberToken(AuthenticatableContract $user)
    {
        $user->setRememberToken($token = Str::random(25));

        $this->provider->updateRememberToken($user, $token);
    }

}