#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’.