Проверьте состояние активного пользователя с помощью 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";
}
Но это может быть использовано только в рамках "попытки аутентификации", если оператор и в этот момент учетные данные пользователей (электронная почта и пропуск) уже проверены. Таким образом, даже если учетная запись пользователя не активна на данный момент, они уже вошли в систему.
Мне нужен способ вернуть подтверждение, чтобы сообщить им, что им все еще нужно активировать свою учетную запись и проверить, установлена ли их учетная запись одновременно с проверкой их электронной почты и пропуска.
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 ("аутентификация") и обработайте соответствующим образом.
В качестве альтернативы, разрешите им войти в систему, но не разрешайте им получать доступ ни к каким страницам, кроме той, которая предлагает ссылку для повторной отправки активации электронная почта.
Фильтры - это правильный путь. Решить эту проблему легко и просто, см. Мой пример ниже.
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";
}
}
Просто сделайте активное поле одним из подтверждений. Вы можете сделать это:
$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(),
]);