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 

http://laravel.com/docs/4.2/validation

Я надеюсь, что это может помочь

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

Другие вопросы по тегам