Auth::viaRemember() 这个方法是怎么用的?

手册这样介绍的:

如果你要“记住”用户,可以使用viaRemember方法来判断用户是否使用“记住我”cookie进行认证

if (Auth::viaRemember()) 
{ 
  //
}<br></br>

我选中“记住我” 登录后,它返回一直是 false,怎么理解?

JellyBool

那么你的具体登录的代码是如何检查的?理论上是下面这样:

$remember = ($request->has('remember')) ? true : false;
 if ( Auth::attempt([
            'email' => $request->get('email'),
            'password' => $request->get('password')
        ],$remember)) 
{
    //user login with remember
}

然后在其他的地方,使用Auth::viaRemember()验证

tlijian1989

@JellyBool

我确实是这样写的,当我登陆后;我在其他方法里执行一次Auth::viaRemember(),返回 false。

    public function login(Request $request)
    {

        $remember = ($request->has('remember')) ? true : false;
        if ( Auth::attempt([
            'email' => $request->get('email'),
            'password' => $request->get('password')
        ],$remember))
        {
            return 'ok';
        }
    }

    public function ok(){

        dd(Auth::viaRemember());

    }
tlijian1989

登陆是成功的。已经check() 验证过

JellyBool

下面这个有出来东西不:

dd(Auth::getRecallerName());
tlijian1989

@JellyBool
是有内容得,remember_xxxxxx
然后重新走一次:

  1. 执行logout 后,特意看了一下 remember 那个字段的是 null
  2. 返回登陆页,选中“记住我” 后点登陆。
  3. 我执行另一个方法查看,已经登陆了,getRecallerName 有值(和之前的值一样),viaRemember返回依然是 false,数据库的 remember 还是 null。
class TestController extends Controller
{
    public function index(){
        return view('login');
    }

    /**
     * 退出
     *
     * @return mixed
     */
    public function logout()
    {
        return Auth::logout();
    }

    /**
     * 登陆
     *
     * @param Request $request
     */
    public function login(Request $request)
    {

        $remember = ($request->has('remember')) ? true : false;

        $info = [
            'email' => $request->get('email'),
            'password' => $request->get('password')
        ];

        if ( Auth::attempt([
            'email' => $request->get('email'),
            'password' => $request->get('password')
        ],$remember))
        {
            $info['remember'] = $remember;
            print_r($info);
            return ;
        }
    }

    /**
     * 测试
     */
    public function ok(){

        var_dump(\Auth::check());
        echo '<hr/>';
        var_dump(Auth::getRecallerName());
        echo '<hr/>';
        var_dump(Auth::viaRemember());

    }

    public function no(){

       //$a= session('errors');
       //dd($a->first());
    }


}
tlijian1989

@JellyBool

protected $fillable = ['name', 'email12', 'password'];

会不会是因为这个原因,没加入 remember_token ,导致laravel 没办法把 token 写进入,所以导致“记住我”这个功能没成功。

JellyBool

非常有可能,我又看了一遍源码,貌似没啥问题。。。实在不行,你试试这样:

 Auth::attempt([
            'email' => $request->get('email'),
            'password' => $request->get('password')
        ]);
if($remember){
    Auth::login($user,true);
}
DAngelo-Russell

https://phphub.org/topics/1011 你解决了吗,我看到一个解决方案。