【问题标题】:Auth::attempt [Laravel] doesn't work well,, It's always return falseAuth::attempt [Laravel] 效果不好,总是返回 false
【发布时间】:2015-04-05 17:51:48
【问题描述】:

每次我尝试测试我的 TestLogin 函数时,它都会返回 false,无论我的输入是不正确的[未存储在数据库中]还是正确的[存储在我的数据库中]...

auth.phph 的配置更正 ['model' => 'User'&& 'table' => 'users']

请在此处提供任何帮助:)

公共函数TestLogin() {

    $data = Input::All();                     //Get Input with POST Request
    $UNameOrEmail = $data['UnameOrEmail'];
    $password = $data['Password'];

    if(filter_var($UNameOrEmail, FILTER_VALIDATE_EMAIL)) {      //Check if Input Is Email or else(then consider it as user name)

        $validator = Validator::make(           //Validation for Email
            array(
                'email' => $UNameOrEmail,
                'password' => $password,
            ),
            array(
                'email' => 'required|email|exists:users,email',
                'password' => 'required|min:8'
            )
        );

        if ($validator->fails()) { //If Email Validation was wrong return validation message
            $messages = $validator->messages();
            return $messages;
        }
        else                           //else store Email&Password in Array
            $user = array(
                'email' => $UNameOrEmail,
                'password' => Hash::make($password)
            );

    }

    else {
        $validator = Validator::make(    //Check User Name Validation
            array(
                'user_name' => $UNameOrEmail,
                'password' => $password,
            ),
            array(
                'password' => 'required|min:8',
                'user_name' => 'required|alpha_dash|between:4,16'
            )
        );

        if ($validator->fails()) {                  //If User Name Validation was wrong return validation message
            $messages = $validator->messages();
            return $messages;
        } else
            $user = array(                           //else store UserName&Password in Array
                'user_name' => $UNameOrEmail,
                'password' => Hash::make($password)
            );

    }


    if (Auth::attempt($user)) {             //Here's the Error

        echo 'Successfully logged in';
    }
    else
    {
        echo 'Some thing go wrong';             //In any case it jum here :(
    }

}

【问题讨论】:

  • 你能展示你的用户模型吗?特别是名为getAuthIdentifier()getAuthPassword()的函数?
  • 受保护的 $table = 'users';公共函数 getAuthIdentifier() { return $this->getKey(); } 公共函数 getAuthPassword() { return $this->password; } 公共函数 getReminderEmail() { return $this->email; }

标签: php authentication laravel controllers


【解决方案1】:

我可以看到您使用的是 Input::All()(大写 A),而不是 Input::all()

做一个dd(Input::All()); 看看它返回什么。

发现问题(我认为):您应该散列您的密码,因为 Auth 会自动执行此操作。简而言之,您手动对其进行哈希处理,然后 Auth 再次对其进行哈希处理,这就是为什么密码永远不会与数据库表中存储的内容匹配的原因:)

【讨论】:

  • 在 PHP 中类和函数名不区分大小写。所以虽然它看起来确实不对,但它仍然可以调用Input::All()
  • No no [Input::All();] 得到与 Input::all(); 相同的结果;这是 dd(Input::All()); 的结果>> 数组(2){ [“UnameOrEmail”]=> 字符串(21)“m.hamdy1994@gmail.com”[“密码”]=> 字符串(8)“12345678”}
  • 是否输入::All();或输入::all();将 print 与 dd(Input::All()); 一起使用后仍然得到相同的结果;或 dd(输入::all());现在我使用 app 插入一条记录并删除 >> Hash::make($password);从我的代码中,但没有新的东西仍然得到相同的消息
【解决方案2】:

在将密码传递给Auth::attempt 之前,您不得散列密码。只需传递普通密码:

$user = array(                           
    'user_name' => $UNameOrEmail,
    'password' => $password
);

还要确保将密码的哈希值存储在数据库中,并且密码字段的长度为 60 个字符。否则哈希将被截断,它不会工作。

【讨论】:

  • 刚试了一下,结果还是一样..我在数据库中插入了一条记录,并用电子邮件和密码cpy&paste测试mu代码,但总是返回false
  • 数据库中的密码是否经过哈希处理?该字段是否至少有 60 个字符长,这样哈希就不会被截断?
  • 我已经手动插入了一个电子邮件和密码,然后评论这一行 //'password' => Hash::make($password) 代替把这个 'password' => $password ...但同样的错误:(
  • 您不能只手动插入密码。它必须被散列。使用artisan tinker 然后echo Hash::make('secret'); 然后将输出复制到您的数据库中
  • 好的,我已经编辑了代码并删除了 Hash::make($password);只是 'password => $password ,并且是数据库中的密码散列,但没有任何改变:/
猜你喜欢
  • 1970-01-01
  • 2016-09-12
  • 2017-05-24
  • 2013-06-11
  • 2015-12-10
  • 2014-03-15
  • 2019-04-14
  • 2012-10-25
相关资源
最近更新 更多