Laravel中的记忆令牌是在需要时创建的(例如,当用户注册并点击“记住我”按钮时。当这种情况发生的默认脚手架于AuthenticatesUsers::attemptLogin
方法来调用:
protected function attemptLogin(Request $request)
{
return $this->guard()->attempt(
$this->credentials($request), $request->has('remember')
);
}
默认后卫接受了“尝试”的方法(2个参数但是实际保卫接口实际上并不需要的尝试方法都存在这都是默认的Laravel脚手架)。
例的SessionGuard
有以下方法尝试:
public function attempt(array $credentials = [], $remember = false)
{
$this->fireAttemptEvent($credentials, $remember);
$this->lastAttempted = $user = $this->provider->retrieveByCredentials($credentials);
if ($this->hasValidCredentials($user, $credentials)) {
$this->login($user, $remember);
return true;
}
$this->fireFailedEvent($user, $credentials);
return false;
}
这反过来又对login
(再次不guard接口只是laravel脚手架的一部分)调用。如果你把下面的调用序列,它只是归结为:
protected function cycleRememberToken(AuthenticatableContract $user)
{
$user->setRememberToken($token = Str::random(60));
$this->provider->updateRememberToken($user, $token);
}
依次为:
protected function queueRecallerCookie(AuthenticatableContract $user)
{
$this->getCookieJar()->queue($this->createRecaller(
$user->getAuthIdentifier().'|'.$user->getRememberToken()
));
}
想必存储在一个(可能是加密的)cookie中的记忆令牌,并用它来自动登录用户稍后。
只要指出Laravel是开源的,并且通过源代码的整个过程是您自己可以随时完成的任何事情,只要您需要有关实施的详细信息。
我建议您先阅读OO PHP中的接口,特征,继承和抽象。你会变得更加熟悉概念。 – Tpojka
[ResetsPasswords](https://github.com/laravel/framework/blob/5.3/src/Illuminate/Foundation/Auth/ResetsPasswords.php#L105)特质似乎只是产生一个60个字符的随机字符串。这个想法是,用户将有一个cookie来匹配存储在数据库中的令牌,并且由于它的长随机字符串,其他用户无法猜出它是什么。 – apokryfos
@apokryfos是的,但哪些功能将remember_token存储在数据库中? –