Проверьте состояние активного пользователя с помощью laravel


Это довольно стандартная функция входа и проверки, которая хорошо работает. Но я также хочу проверить, активен ли пользователь. Я настроил столбец в своей таблице пользователей с "активным" значением 0 или 1.

public function post_login() 
{
    $input = Input::all();

    $rules = array(
        'email' => 'required|email',
        'password' => 'required',
    );  

    $validation = Validator::make($input, $rules);

    if ($validation->fails())
    {
        return Redirect::to_route('login_user')
            ->with_errors($validation->errors)->with_input();
    }

    $credentials = array(
        'username' => $input['email'],
        'password' => $input['password'],
    );

    if (Auth::attempt($credentials)) 
    {
        // Set remember me cookie if the user checks the box
        $remember = Input::get('remember');
        if ( !empty($remember) )
        {
            Auth::login(Auth::user()->id, true);
        }

        return Redirect::home();

    } else {
        return Redirect::to_route('login_user')
            ->with('login_errors', true);
    }
}

Я уже пробовал что-то подобное:

$is_active = Auth::user()->active;

if (!$is_active == 1)
{
    echo "Account not activated";
}

Но это может быть использовано только в рамках "попытки аутентификации", если оператор и в этот момент учетные данные пользователей (электронная почта и пропуск) уже проверены. Таким образом, даже если учетная запись пользователя не активна на данный момент, они уже вошли в систему.

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

Author: Stephan-v, 2013-05-25

5 answers

Лучшим решением может быть создание драйвера аутентификации, который расширяет уже используемый драйвер аутентификации, а затем переопределяет метод попытки.

Затем измените конфигурацию авторизации, чтобы использовать свой драйвер.

Что-то вроде:

<?php

class Myauth extends Laravel\Auth\Drivers\Eloquent {

    /**
     * Attempt to log a user into the application.
     *
     * @param  array $arguments
     * @return void
     */
    public function attempt($arguments = array())
    {
        $user = $this->model()->where(function($query) use($arguments)
        {
            $username = Config::get('auth.username');

            $query->where($username, '=', $arguments['username']);

            foreach(array_except($arguments, array('username', 'password', 'remember')) as $column => $val)
            {
                $query->where($column, '=', $val);
            }
        })->first();

        // If the credentials match what is in the database we will just
        // log the user into the application and remember them if asked.
        $password = $arguments['password'];

        $password_field = Config::get('auth.password', 'password');

        if ( ! is_null($user) and Hash::check($password, $user->{$password_field}))
        {
            if ($user->active){
                return $this->login($user->get_key(), array_get($arguments, 'remember'));
            } else {
                Session::flash('authentication', array('message' => 'You must activate your account before you can log in'));
            }
        }

        return false;
    }
}
?>

На экране входа в систему проверьте наличие Session::get ("аутентификация") и обработайте соответствующим образом.

В качестве альтернативы, разрешите им войти в систему, но не разрешайте им получать доступ ни к каким страницам, кроме той, которая предлагает ссылку для повторной отправки активации электронная почта.

 2
Author: PottyBert, 2013-05-26 11:51:44

Фильтры - это правильный путь. Решить эту проблему легко и просто, см. Мой пример ниже.

Route::filter('auth', function()
{
    if (Auth::guest())
{
    if (Request::ajax())
    {
        return Response::make('Unauthorized', 401);
    }
    else
    {
        return Redirect::guest('login');
    }
}
else
{
    // If the user is not active any more, immidiately log out.
    if(Auth::check() && !Auth::user()->active)
    {
        Auth::logout();

        return Redirect::to('/');
    }
}
});
 8
Author: blinkiebill, 2014-10-16 16:20:00

Не можете ли вы использовать что-то вроде этого:

if (Auth::once($credentials))
{
    if(!Auth::user()->active) {
        Auth::logout();

        echo "Account not activated";
    }
}
 4
Author: Antonio Carlos Ribeiro, 2013-05-25 15:01:57

Просто сделайте активное поле одним из подтверждений. Вы можете сделать это:

$credentials = array(
        'username' => $input['email'],
        'password' => $input['password'],
        'active' => 1
    );

    if (Auth::attempt($credentials)) 
    {
        // User is active and password was correct
    }

Если вы хотите специально сообщить пользователю, что они неактивны, вы можете сделать это следующим образом:

    if (Auth::validate(['username' => $input['email'], 'password' => $input['password'], 'active' => 0]))
    {
        return echo ('you are not active');
    }
 3
Author: Laurence, 2014-10-12 15:59:28

Вот что я делаю:

if (\Auth::attempt(['EmailWork' => $credentials['EmailWork'], 'password' => $credentials['Password']], $request->has('remember'))) {
    if (\Auth::once(['EmailWork' => $credentials['EmailWork'], 'password' => $credentials['Password']])) {
        if (!\Auth::user()->FlagActive == 'Active') {
            \Auth::logout();
            return redirect($this->loginPath())
                ->withInput($request->only('EmailWork', 'RememberToken'))
                ->withErrors([
                    'Active' => 'You are not activated!',
                ]);
        }
    }

    return redirect('/');
}

return redirect($this->loginPath())
    ->withInput($request->only('EmailWork', 'RememberToken'))
    ->withErrors([
        'EmailWork' => $this->getFailedLoginMessage(),
    ]);
 0
Author: Nisal Gunawardana, 2016-02-04 11:47:48