如何比较Laravel';s使用自定义登录表单的哈希密码


How to compare Laravel's hash password using a custom login form?

你能帮我吗?我正在使用Laravel构建自己的登录表单。但我有一个问题,因为我使用哈希方法存储密码,在我的登录表单中,我再次使用哈希方法进行比较。但我发现哈希值总是在变化。

这是我在路线中的代码:

Route::post('/admin_handle_login', function()
{
    $rules = array(
        'admin_username'    =>  'required',
        'admin_password'    =>  'required'
    );
    $validate_admin_login = Validator::make(Input::all(), $rules);
    if($validate_admin_login->fails()) {
        $messages = $validate_admin_login->messages();
        Session::flash('warning_notification','Error: Incomplete details!');
        return Redirect::to('/flaxadmin')
                            ->withErrors($messages)
                            ->withInput(Input::except('admin_password'));
    } else {
        $d = array(
            Input::get('admin_username'), Hash::make(Input::get('admin_password'))
        );
        $validate_admin = DB::table('administrators')
                            ->select('username')
                            ->where('username', Input::get('admin_username'))
                            ->where('password', Hash::check('password', Input::get('admin_password')))
                            ->count();
        fp($d);
        fp($validate_admin);
    }
});

结果是

Array
(
    [0] => admin002
    [1] => $2y$10$RTwKHN9W1/unu1ZhYlNjauApJjjoNTBnE6td/AZ5jWgZEdqVav0um
)
0

在我的数据库中,admin002的密码是

$2y$10$47sSXLzh/YXN6Rf2fmljYO7lZaxfhXVSUTp5bssR2gYQ6Nw9luUH2

我的代码错了吗?或者有什么合适的方法可以做到这一点吗?我是拉腊维尔的一个乞丐。。

首先,不能用这种方式。假设username是唯一的,您应该执行以下操作:

$validate_admin = DB::table('administrators')
                            ->select('username')
                            ->where('username', Input::get('admin_username'))
                            ->first();
if ($validate_admin && Hash::check(Input::get('admin_password'), $validate_admin->password)) {
  // here you know data is valid
}

然而,您应该考虑使用内置方法,而不是自己编写代码。如果您只想登录/检查具有密码的用户,那么您有Auth::attemptAuth::validate,所以实际上不需要自己编写代码。

在这里,您将使用输入密码的哈希版本检查字符串"password"。

因此,尝试通过用户名获取用户,如果有结果,可以将存储在数据库中的哈希版本的密码与输入密码进行比较。像这样:

$user = DB::table('administrators')
        ->select('username', 'password')
        ->where('username', Input::get('admin_username');
if($user->count()) {
    $user = $user->first();
    if(Hash::check(Input::get('admin_password'), $user->password)) {
         //User has provided valid credentials :)
    }
}

marcin nabiałek的答案略有改进,您现在可以使用PHP的password_verify来实现相同的

$user = App'User::where('email', $request->email)->first();
if($user && password_verify($request->password, $user->password)) {
   // authenticated user,
   // do something...
}

这是一个非常有用的代码,100%laravel 6/7/8。

if ($data = AddEmployee::where('name', $request->name)-first()) {
  $pass = Hash::check($request->password, $data->password);
  if ($pass) {
    echo "sucess";
  } else {
    echo "Password Not Valid";
  }
} else {
  echo "Username Not Valid" . "<br>";
}