【问题标题】:Laravel 5.5 Auth attempt method only returns falseLaravel 5.5 Auth 尝试方法仅返回 false
【发布时间】:2019-02-04 23:08:14
【问题描述】:

这可能是关于为什么 auth:attempt 总是返回错误的一个反复出现的问题,但是尽管寻找答案,但我无法进一步解决我的问题。

我有一个学生表,id 为 std_id,电子邮件为 std_email,密码为 std_password。为了克服默认密码字段,我浏览了一些答案并建议使用此功能覆盖字段名称

public function getAuthPassword() {
        return $this->std_password;
    }

而尝试函数是

public function authenticate(Request $request)
    {
        if (Auth::attempt(['std_email' => $request['std_email'], 'password' => $request['std_password']])){
            return response()->json([
                'validated' => true
            ]);
        }else{
            return response()->json([
                'validated' => false
            ]);
        }
    }

所以,我更新了两个文件,auth/LoginController.php

<?php

namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\AuthenticatesUsers;
use \Illuminate\Support\Facades\Auth;
use Illuminate\Http\Request;

class LoginController extends Controller
{
    /*
    |--------------------------------------------------------------------------
    | Login Controller
    |--------------------------------------------------------------------------
    |
    | This controller handles authenticating users for the application and
    | redirecting them to your home screen. The controller uses a trait
    | to conveniently provide its functionality to your applications.
    |
    */

    use AuthenticatesUsers;

    /**
     * Where to redirect users after login.
     *
     * @var string
     */
    protected $redirectTo = '/home';

    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('guest')->except('logout');
    }

    public function authenticate(Request $request)
    {
        if (Auth::attempt(['std_email' => $request['std_email'], 'password' => $request['std_password']])){
            return response()->json([
                'validated' => true
            ]);
        }else{
            return response()->json([
                'validated' => false
            ]);
        }
    }

}

和用户模型为

<?php

namespace App;

use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable
{
    use Notifiable;

    protected $primaryKey = "std_id";
    protected $table = "students";

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'std_email', 'std_password',
    ];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        //'std_password', 'remember_token',
    ];

    public function getAuthPassword() {
        return $this->std_password;
    }

}

我确保在用户模式下,我已将主键设置为 std_id 并将表设置为学生。

另外,当我注册学生时,我使用 bcrypt 对密码进行哈希处理并将其保存在数据库中。

public function create(Request $request){

        $account_exists = $this->check_account_exists($request['email']);

        if($account_exists){

            return response()->json(['account'=>true]);

        }else{

            DB::table('students')->insert([
                'std_fname'     => $request['first_name'],
                'std_lname'     => $request['last_name'],
                'std_email'     => $request['email'],
                'std_password'  => bcrypt($request['std_password']),
                'group_id'      => $request['group'],
                'std_isActive'  => 1
            ]);

            return response()->json(['created'=>true]);

        }

    }

此时我没有得到任何答案,为什么尝试方法失败,因为我已确保登录信息正确?你能看看我是否遗漏了什么吗?

谢谢!

【问题讨论】:

  • 你试过Auth::attempt(['std_email' =&gt; $request['std_email'], 'std_password' =&gt; $request['std_password']] 吗?并确保您在$request 中获得了价值
  • 首先你使用password而不是你的数据库列std_password
  • @LeenaPatel,我不这么认为,但请查看我的答案。

标签: php laravel laravel-5 laravel-5.5


【解决方案1】:

Hash::make($request['std_password']) 加密密码也请分享您的来自 auth.php 的代码

【讨论】:

  • 当 auth::attempt() 方法会处理密码时,为什么我需要对密码进行哈希处理?
  • 是的,它会处理这个问题,但在存储到数据库之前,您应该使用用户 hash make
【解决方案2】:

我尝试了不同的方法,但都没有奏效。然而,我发现了一个非常有趣的发现。也许我以前不知道这件事。存储密码时,我设置了第一个密码(auth::attempt 方法总是返回 false)包括至少 1 个大写字母和 1 个特殊字符,密码是“Abcde12!”。每次都这样失败。 接下来,我添加了一个没有这些规则的简单密码,并作为“秘密”保存在数据库中。当我测试登录时,它返回true。 所以现在真正的问题是,为什么用特殊字符散列密码不起作用?

【讨论】:

    【解决方案3】:

    看起来好像你在进来

        'password' => $request['std_password']
    

        Auth::attempt()
    

    当您的数据库表不包含“密码”列时的方法。你可能想传入

        'std_password' => $request['std_password']
    

    但即便如此,我也不确定

        Auth::attempt()
    

    在将密码输入与数据库中的“std_password”哈希值进行比较之前,将知道对密码输入进行哈希处理。你大概可以找到修改方法

        Auth::attempt()
    

    或者创建一个新的尝试方法,在比较之前对输入进行哈希处理......或者你可以使用

        bcrypt()
    

    在您将“std_password”输入传递给尝试之前对其进行哈希处理。

    【讨论】:

    • Auth::attempt() 不接受 password 字段的自定义名称。 User 模型中的getAuthPassword() 访问器是将密码字段映射到不同名称的地方。
    猜你喜欢
    • 1970-01-01
    • 2019-04-14
    • 2015-03-17
    • 1970-01-01
    • 2017-05-11
    • 2019-06-28
    • 2018-01-07
    • 2019-05-24
    • 2015-03-03
    相关资源
    最近更新 更多