Это довольно стандартная функция входа и проверка, которая работает хорошо. Но я также хочу проверить, что пользователь активен. Я установил столбец в моей таблице пользователей с «активным», установленным в 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"; }
Но это можно использовать только в инструкции «auth try» if, и в этот момент учетные данные пользователей (email и pass) уже проверяются. Таким образом, даже если учетная запись пользователей, если она не активна, в данный момент, они уже вошли в систему.
Мне нужен способ вернуть валидацию, чтобы сообщить им, что они все равно должны активировать свою учетную запись и проверить, установлена ли их учетная запись одновременно с проверкой их электронной почты и прохода.
Лучшим решением может стать создание драйвера Auth, который расширяет уже использованный драйвер Eloquent Auth, а затем переопределяет метод попытки.
Затем измените конфигурацию auth, чтобы использовать ваш драйвер.
Что-то вроде:
<?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 ('authentication') и обработайте соответственно.
Кроме того, разрешите им войти в систему, но не позволяйте им обращаться к другим страницам, кроме тех, которые предлагают ссылку для повторной отправки электронного письма активации.
Фильтры – это путь. Для решения этой проблемы легко и просто, см. Мой пример ниже.
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('/'); } } });
из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('/'); } } });
Не можете ли вы использовать что-то вроде этого:
if (Auth::once($credentials)) { if(!Auth::user()->active) { Auth::logout(); echo "Account not activated"; } }
изif (Auth::once($credentials)) { if(!Auth::user()->active) { Auth::logout(); echo "Account not activated"; } }
Просто сделайте активное поле одним из подтверждений. Вы можете сделать это:
$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'); }
Вот что я делаю:
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(), ]);
из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(), ]);