Как сравнить хэш-код Laravel с помощью пользовательской формы входа?

ты можешь помочь мне с этим? Я создаю свою собственную регистрационную форму, используя Laravel. Но у меня проблема, потому что я сохранил свой пароль, используя метод Hash, и в моей форме входа я снова использовал хэш-метод для сравнения. Но я узнал, что значение хэша всегда меняется.

Вот мой код в маршрутах:

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

Является ли мой код неправильным? Или есть какой-нибудь правильный способ сделать это? Я начинаю в Ларавеле ..

php,laravel,hash,

4

Ответов: 3


6 ов принято

Во-первых, вы не можете этого сделать. Предполагая, что 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::attemptили Auth::validateесли вы хотите войти в систему / проверить только пользователя с паролем, поэтому нет необходимости его кодировать самостоятельно.


2

Здесь вы проверяете строку «пароль» с хешированной версией пароля ввода.

Поэтому попробуйте загрузить пользователя по имени пользователя, и если у вас есть результат, вы можете сравнить хешированную версию пароля, хранящуюся в базе данных, с паролем ввода. Вот так:

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

0

Небольшое улучшение Marcin-nabialek «s ответ , теперь вы можете использовать РНР password_verifyдля достижения того же

$user = AppUser::where('email', $request->email)->first();

if($user && password_verify($request->password, $user->password)) {
   // authenticated user,
   // do something...
}
PHP, Laravel, хэш,
Похожие вопросы