#php #laravel #laravel-8 #laravel-authentication #laravel-fortify
#php #laravel #laravel-8 #laravel-аутентификация #laravel-fortify
Вопрос:
Я пытаюсь разрешить пользователям входить в систему, используя либо электронную почту, либо имя пользователя вместе со своим паролем.
Я добавил следующий код внутри boot () в FortifyServiceProvider.php :
Fortify::authenticateUsing(function (Request $request) {
$user = User::where('email', $request->email)
->orWhere('username', $request->username)
->first();
if ($user amp;amp;
Hash::check($request->password, $user->password)) {
return $user;
}
});
Но теперь, когда пользователи пытаются войти в систему, введя свое имя пользователя вместо электронной почты, они получают следующее сообщение об ошибке:
These credentials do not match our records.
Ответ №1:
Я забыл изменить следующую строку:
->orWhere('username', $request->username)
Для:
->orWhere('username', $request->email)
Потому что просто в моей форме входа есть только одно поле, которое может содержать либо адрес электронной почты, либо имя пользователя. Имя этого поля — «email».
Ответ №2:
Отличный ответ, это сработало хорошо!
Для тех, кто использует Vue.js:
- Убедитесь, что в Login.vue (ресурсы / js / Страницы / Auth/) вы изменили атрибут ‘type’ ввода ’email’ с ’email’ на ‘text’ (
type="text"
), иначе вы получите ошибку проверки. Также измените значение метки на «Имя пользователя или адрес электронной почты». - Убедитесь, что ‘Register.vue’ и ‘UpdateProfileInformation.vue’ (resources /js / Pages /Profile) содержит входные данные для ‘Username’ в шаблоне и
username: this.user.username
в форме данных скрипта. - Убедитесь, что ‘CreateNewUser.php ‘ и ‘UpdateUserProfileInformation.методы php’ (app / Actions / Fortify /) включают это поле (с «уникальным» правилом).
- Убедитесь, что в модели «User» есть поле «username» (уникальное, с соответствующей миграцией БД).
Ответ №3:
Сначала, как в документации, настраивающей аутентификацию пользователя
public function boot()
{
Fortify::authenticateUsing(function (Request $request) {
$user = User::where('email', $request->email)->first();
if ($user amp;amp;
Hash::check($request->password, $user->password)) {
return $user;
}
});
// ...
}
Отфильтруйте ваш запрос:
$username = filter_var($request->email, FILTER_VALIDATE_EMAIL) ? 'email' : 'name';
Fortify::authenticateUsing(function (Request $request) {
$username = filter_var($request->email, FILTER_VALIDATE_EMAIL) ? 'email' : 'name';
$user = User::where($username, $request->email)
->first();
if (
$user amp;amp;
Hash::check($request->password, $user->password)
) {
return $user;
}
});