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

21,413

Solution 1

First, you cannot do it this way. Assuming username is unique, you should do:

$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
}

However you should think about rather using built-in methods than coding it yourself. You have Auth::attempt or Auth::validate if you want to login/check only user with password so there's really no need to code it yourself.

Solution 2

Here you're checking the string 'password' with the hashed version of the input password.

So try fetching the user by their username and if you've a result you can compare the hashed version of the password, stored in the database, with the input password. Like so:

$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 :)
    }
}

Solution 3

A slight improvement to marcin-nabiałek's answer, you can now use PHP's password_verify to achieve the same

$user = App\User::where('email', $request->email)->first();

if($user && password_verify($request->password, $user->password)) {
   // authenticated user,
   // do something...
}
Share:
21,413
Jerielle
Author by

Jerielle

Too many to mention. :-)

Updated on July 22, 2022

Comments

  • Jerielle
    Jerielle almost 2 years

    Can you help me with this? I am building my own login form using Laravel. But I have a problem because I stored my password using Hash method and in my login form I used hash method again to compare. But I found out that the hash value is always changing.

    Here's my code in routes:

    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);
    
        }
    
    });
    

    The result is

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

    In my database the password of admin002 is

    $2y$10$47sSXLzh/YXN6Rf2fmljYO7lZaxfhXVSUTp5bssR2gYQ6Nw9luUH2
    

    Is my code wrong? Or are there any proper way to do this? I am a begiiner in Laravel..

  • Daniel Gelling
    Daniel Gelling over 9 years
    What'll happen if no user exists?
  • Marcin Nabiałek
    Marcin Nabiałek over 9 years
    @DanielGelling I've added $validate_admin && at the beginning of if statement
  • Jerielle
    Jerielle over 9 years
    Ok I already used the model USER but I don't know how to change or overwrite the table inside the model USER. What I know is the Auth::validate is using the User model class. I used this in my customer account and it is working so I decided to create another login for my admin account
  • Marcin Nabiałek
    Marcin Nabiałek over 9 years
    @Jerielle So you could probably look also at stackoverflow.com/questions/18785754/…
  • ayyanar pms
    ayyanar pms over 4 years
    i don't know how this answer got up votes, IF condition is wrong, it should be Hash::check(Input::get('admin_password'),$user->password)
  • Daniel Gelling
    Daniel Gelling over 4 years
    @ayyanarpms You are correct, there is (was) a missing bracket...