Laravel的Auth :: attempt()返回true但Auth :: check()返回false

时间:2015-01-05 13:53:15

标签: php authentication laravel

正如标题所说,Laravel的函数Auth::attempt()在以下代码部分中返回true(删除了不重要的部分):

public function doLogin()
{
    $validator = [..]

    if ($validator->fails()) {
        [..]
    } else {
        $userdata = array(
            'username'  => Input::get('username'),
            'password'  => Input::get('password')
        );

        if (Auth::attempt($userdata, true)) {
            return Redirect::to('/');
        } else {        
            return Redirect::to('login');
        }
    }
}

但是当我们被重定向时,我们会尝试检查用户是否真的使用Auth::check()登录,并以某种方式返回false

我们已经在Google上尝试了所有可能的解决方案,并且没有成功解决任何问题。例如,我们添加了remember_token,但它没有改变任何内容,但它证明了Auth::attempt()做了某些事情,因为在数据库中设置了remember_token

作为最后的手段,我们甚至试图在Auth::attempt()的Laravel ./vendor/laravel/framework/src/Illuminate/Auth/Guard.php方法中打印一些内容,但我们没有看到任何内容,甚至没有print_r。我们试图在完整的代码库中找到其他尝试函数,但没有找到。

关于将User更改为翻译后的形式可能会导致其中断,但是函数Auth::attempt()也可能会被破坏。

看起来真的很神奇,但我们不知道是什么或如何。还有其他人有想法吗?

2 个答案:

答案 0 :(得分:5)

默认情况下,Laravel假定每个表都有一个名为id的主键。

可能的解决方案是在您的模型中执行此操作:

protected $primaryKey = 'id'; //Or what ever id name do you have.

如果您尝试将laravel-mongodb与自定义增量和唯一生成的id一起使用而不是MongoDB的默认_id,则可能会发生此错误。在这种情况下,解决方案不是将您的自定义ID命名为“id' id'因为这会让Laravel感到困惑。但是,请将其他名称命名。

答案 1 :(得分:0)

对于仍然存在此问题的用户,如果您的主键不遵循autoIncrement,则应将以下代码添加到您的用户模型中:

public $incrementing=false;

,如果您更改了主列名称,请添加以下内容:

protected $primaryKey = 'vid'; //changed to vid