Плохая практика? Берем строку по имени пользователя, затем выполняем проверки, если пароли совпадают, а затем добавляем в сеанс?

#php #mysql #laravel #authentication

#php #mysql #laravel #аутентификация

Вопрос:

 $user = AppUser::where("name", $req->us)->firstOrFail();
  

затем:

 if(Hash::check($plain_text_password, $user->password)){
   //add user to session
}
else{
  //bad credentials
}
  

Я знаю о других методах, доступных в Laravel, я спрашиваю об этой конкретной ситуации.

Комментарии:

1. и используйте промежуточное программное обеспечение для фильтрации запросов.

2. Обычно все наоборот: необработанный ввод или хэширование в базе данных с использованием функции проверки пароля.

3. Да, моя ошибка…

4. Я исправил это, так что вопрос все тот же. Плохо ли это делать? Получаем пароль по имени пользователя, а затем проверяем его с помощью функций и, если все идет хорошо, добавляем сеанс?

5. если вы используете laravel, почему бы не воспользоваться Auth Middleware и не использовать Auth::attempt() вместо этого?

Ответ №1:

Есть два подхода.

Подход 1. Вы можете добавить оба имени пользователя и пароль в условии where.

Если имя пользователя и пароль не совпадают, сообщение об ошибке будет выглядеть как «Неверные имя пользователя и пароль»

Подход 2. (Ваш подход). Получаем запись пользователя из таблицы пользователей с помощью where("name", $req->us) и проверяем пароль if(Hash::check($user->password, $user->password)) . Преимущество этого подхода в том, что вы можете показать сообщение об ошибке, как показано ниже.

  • Если имени пользователя нет в таблице, вы можете отобразить ошибку типа «Неверное имя пользователя».
  • Если пароль не соответствует, вы можете отобразить ошибку типа «Неверный пароль».

Вы можете использовать любой подход, и с точки зрения безопасности вы можете выбрать подход 1.

Комментарии:

1. Это приятно слышать. Хотя я допустил ошибку в коде. Если вы можете, пожалуйста, исправьте свой пост, он должен был быть таким Hash::check ($plain_text_password, $user-> password) Спасибо за ответ. Я знал о 1-м, хотя я хотел большей гибкости, я знаю, что можно редактировать / расширять уже готовый контроллер аутентификации по своему вкусу, но я хотел более простое решение.

Ответ №2:

Почему бы не использовать следующий код, поскольку это более чистый подход для проверки наличия имени пользователя в базе данных, а затем входа в систему?

 // do validation 
$validator = Validator::make($request->all(), [
    'username'    =>    'required|exists:users',
    'password'    =>    'required' 
]);

if($validator->fails()) {
     return redirect()->back()->withErrors($validator); 
}

// try login using given credentials 
if (Auth::attempt(['username' => $request->input('username'), 'password' =>   $request->input('password')])) {
       // Authentication passed...
       return redirect()->intended('dashboard'); 
}
  

Комментарии:

1. else { // аутентификация не пройдена } Мне нужны два разных сообщения: ‘пользователь не активирован, проверьте электронную почту’ ‘неверный пароль / имя пользователя’ Я не хочу использовать Auth::attempt , потому что, насколько я знаю, я не могу сказать, активирована ли учетная запись, я знаю, что могу добавить дополнительные параметры, чтобы попытаться проверить другие поля, но если это не удается, это переходит к ‘else’.