按照文档所说
但是你直接使用viaRemember()
这个函数是没用的
查看SessionGuard文件,可以发现viaRemeber
这个属性是在SessionGuard::user()
中被设置的
所以想在登录界面自动登录,只需要使用Auth::user()
就行了
如果想只在用户选择记住我才自动登录
在选择了记住我时,laravel会生成一个相关的cookie,如remember_web_59ba36addc2b2f9401580f014c7f58ea4e30989d
,名字由下面的函数生成
这样,如果当前的session已经失效,SessionGuard::user()
会使用remember_web_59ba36addc2b2f9401580f014c7f58ea4e30989d
的值去调用retriveveByToken
来查找对应的用户,然后设置用户,这样就实现了自动登录
按照文档所说
但是你直接使用viaRemember()
这个函数是没用的
查看SessionGuard文件,可以发现viaRemeber
这个属性是在SessionGuard::user()
中被设置的
所以想在登录界面自动登录,只需要使用Auth::user()
就行了
如果想只在用户选择记住我才自动登录
在选择了记住我时,laravel会生成一个相关的cookie,如remember_web_59ba36addc2b2f9401580f014c7f58ea4e30989d
,名字由下面的函数生成
这样,如果当前的session已经失效,SessionGuard::user()
会使用remember_web_59ba36addc2b2f9401580f014c7f58ea4e30989d
的值去调用retriveveByToken
来查找对应的用户,然后设置用户,这样就实现了自动登录
按照文档所说
但是你直接使用viaRemember()
这个函数是没用的
查看SessionGuard文件,可以发现viaRemeber
这个属性是在SessionGuard::user()
中被设置的
所以想在登录界面自动登录,只需要使用Auth::user()
就行了
如果想只在用户选择记住我才自动登录
在选择了记住我时,laravel会生成一个相关的cookie,如remember_web_59ba36addc2b2f9401580f014c7f58ea4e30989d
,名字由下面的函数生成
这样,如果当前的session已经失效,SessionGuard::user()
会使用remember_web_59ba36addc2b2f9401580f014c7f58ea4e30989d
的值去调用retriveveByToken
来查找对应的用户,然后设置用户,这样就实现了自动登录
这是手册上的说明:
如果你想要提供「记住我」的功能,你需要传入一个布尔值到 attempt 方法的第二个参数,在用户注销前 session 值都会被一直保存。users 数据表一定要包含一个 remember_token 字段,这是用来保存「记住我」令牌的。
if (Auth::attempt(['email' => $email, 'password' => $password], $remember)) {
// 这个用户被记住了...
}
在 LoginController 里面 use AuthenticatesUsers
trait, 在里面可以找到 attemptLogin
方法,默认帮你处理了
protected function attemptLogin(Request $request)
{
$credentials = $this->credentials($request);
return $this->guard()->attempt(
$credentials, $request->has('remember')
);
}
如果要在深入一点的话可以查看 Illuminate\Auth\SessionGuard
下 login
方法
public function login(AuthenticatableContract $user, $remember = false)
{
$this->updateSession($user->getAuthIdentifier());
// If the user should be permanently "remembered" by the application we will
// queue a permanent cookie that contains the encrypted copy of the user
// identifier. We will then decrypt this later to retrieve the users.
if ($remember) {
$this->ensureRememberTokenIsSet($user);
$this->queueRecallerCookie($user);
}
// If we have an event dispatcher instance set we will fire an event so that
// any listeners will hook into the authentication events and run actions
// based on the login and logout events fired from the guard instances.
$this->fireLoginEvent($user, $remember);
$this->setUser($user);
}
可在 app/Http/Middleware/RedirectIfAuthenticated.php 中修改用户已登录的处理:
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Support\Facades\Auth;
class RedirectIfAuthenticated
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @param string|null $guard
* @return mixed
*/
public function handle($request, Closure $next, $guard = null)
{
if (Auth::guard($guard)->check()) {
session()->flash('info', '您已登录,无需再次操作');
return redirect('/');
}
return $next($request);
}
}
这个教程后续有讲到。
@GerBawn 写得不错,不过我感觉这里还是有点小问题,如果当用户的session还没有失效,那么Auth::viaRemember()还是返回false,这样反而无法自动登录。实际上,Auth::user()已经考虑的比较全面了,只有在session失效后才会去调用Auth::viaRemember(),这个Auth::viaRemember()已经包含在Auth::user()中了。。所以第一个写法应该就足够了:
推荐文章: