Laravel: Auth:: попытки - почему проверка подлинности не удалась?
Я аутентифицирую пользователей с условиями, т.е. если
Роль пользователя = 1 Вход в систему должен быть успешным, иначе вход в систему должен быть неудачным
Теперь то, что я делаю сейчас:
if (Auth::attempt(array('email' => $email, 'password' => $password, 'role' => 1)))
{
// Login User
} else {
return Redirect::route('admin.login')
->with('message', 'Unauthorized user Or wrong email / password combination');
}
Он работает нормально, но при сбое аутентификации я хочу выяснить причину сбоя, поэтому я смогу отображать следующие сообщения на основании причины неудачной аутентификации:
- несуществующий адрес электронной почты
- неправильный пароль
- неверная роль пользователя.
Есть ли способ сделать это?
5 ответов
Благодаря @Shift Exchange вот как я это понял:
if (Auth::attempt(array('email' => $email, 'password' => $password, 'role' => 1)))
{
dd('Login Successful');
} else {
if( Auth::validate( array( 'email' => $email, 'password' => $password ) ) )
{
// Wrong Role
dd('Unauthorized user');
} else {
dd('Wrong email / password');
}
}
Это сработало!!
Хитрость заключается в использовании Auth::validate()
в неудачном разделе. Вам нужно будет сделать пару проверок, чтобы понять, в чем проблема
if (Auth::attempt(array('email' => $email, 'password' => $password, 'role' => 1)))
{
// Login User
} else {
Auth::validate(array('email' => $email, 'password' => $password)) {
// Wrong role
} else {
if (User::where('email', $email)->first()) {
// Wrong password
} else {
// Wrong username
}
}
Сначала попробуйте проверить, а затем попробуйте войти
Validating Multiple Fields
Я надеюсь, что это может помочь
public function postSignIn() {
// checking for validation
$validator = Validator::make(Input::all(), array(
'email' => 'required|email',
'password' => 'required'
));
//if validation fails
if ($validator->fails()) {
return Redirect::route('sign-In')
->withErrors($validator)
->withInput();
} else {
$auth = Auth::attempt(array(
'email' => Input::get('email'),
'password' => Input::get('password'),
'active' => 1,
));
if ($auth) {
return Redirect::route('home');
} else {
return Redirect::route('sign-In')->with('fails', 'Email/password wrong, or account not activated.') ;
}
в представлении напишите эти проверки ответов сверху или снизу каждого поля с именами полей, где email - это имя поля
@if($errors->has('email'))
{{$errors->first('email')}}
@endif
@if($errors->has('password'))
{{$errors->first('passwrd')}}
@endif
Так как я новичок в Laravel, поэтому я использовал более длительный процесс
Это функция, используемая laravel для аутентификации. если вы видите здесь: vendor/laravel/framework/src/ подсветка /Auth/Guard.php
public function attempt(array $credentials = array(), $remember = false, $login = true)
{
$this->fireAttemptEvent($credentials, $remember, $login);
$this->lastAttempted = $user = $this->provider->retrieveByCredentials($credentials);
// If an implementation of UserInterface was returned, we'll ask the provider
// to validate the user against the given credentials, and if they are in
// fact valid we'll log the users into the application and return true.
if ($this->hasValidCredentials($user, $credentials))
{
if ($login) $this->login($user, $remember);
return true;
}
return false;
}
и если вы видите через источник, эта функция использует функцию hasValidCredentials, и если вы продолжите копать, функция будет:
protected function hasValidCredentials($user, $credentials)
{
return ! is_null($user) && $this->provider->validateCredentials($user, $credentials);
}
и в интерфейсе UserProviderInterface вы видите, что этот интерфейс был определен, и вы можете реализовать его самостоятельно и вернуть причину проблемы с аутентификацией вместо false или true