【问题标题】:Laravel's Auth::attempt() returns true but Auth::check() returns falseLaravel 的 Auth::attempt() 返回 true 但 Auth::check() 返回 false
【发布时间】:2015-03-03 01:50:31
【问题描述】:

正如标题所说,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 是在数据库中设置的。

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

可能是因为将 User 更改为它的翻译形式会导致其损坏,但函数 Auth::attempt() 也可能会损坏。

似乎真的发生了一些神奇的事情,但我们不知道是什么或如何发生的。其他人有想法吗?

【问题讨论】:

  • app/config/auth.php 你设置了哪个驱动?在app/config/session.php 中设置了哪个驱动程序?
  • 您可能对导致其行为不端的文件拥有一些权限。尝试修改app/storage/sessions 目录的权限。如果这不起作用,请查看它是否可以通过使用不同的会话驱动程序来工作。
  • 一般会话有效吗? Session::put('foo', 'bar') 并在另一个请求中 Session::get('foo')
  • 嗯。所以会话不是问题。也许remember 选项在这里搞砸了。你试过Auth::attempt($userdata)吗?
  • @Renzeee 我今天遇到了类似的问题。您是否在模型中定义了主键?因为我没有在User 模型中定义主键,并且在定义主键之后一切对我来说都很好。所以试试这个。也许这会对你有所帮助。

标签: php authentication laravel


【解决方案1】:

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

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

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

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

【讨论】:

  • 我面临同样的问题,我正在使用laravel-mongodb。我尝试了 cmets 中给出的解决方案,但没有成功。有没有其他解决办法?
  • 非常感谢您为我节省了很多时间,我需要很长时间才能弄清楚这一点
  • 我的上帝!!!!!!!我想亲自感谢您....六个小时后..您解决了我的问题。非常感谢!!!!!!!!!!!!!!!!
【解决方案2】:

对于那些仍然有这个问题的人,如果你的主键不遵循自动增量,你应该在你的用户模型中添加以下代码:

public $incrementing=false;

如果您更改了主列名称,请添加:

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

【讨论】:

    猜你喜欢
    • 2015-12-14
    • 2017-05-11
    • 2020-02-14
    • 2019-05-24
    • 2018-01-07
    • 2014-11-22
    • 1970-01-01
    • 2016-09-12
    • 2017-05-24
    相关资源
    最近更新 更多