Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 24.06.2014 08:58:29

Авторизация с проверкой дополнительных полей.

Здравствуйте. Пожалуйста, подскажите мне решение такого вопроса:
- Есть авторизация на сайте, написанном на Laravel. Работает нормально, но, мне нужно сделать проверку на "заблокирован ли пользователь". Т.е. в базе с пользователями есть поле "blocked" и если в нём содержится единица, то при авторизации вывести пользователю: "Ваш аккаунт блокирован".

Я знаю, можно сделать примерно так:

$data = [
            'email'    => Input::get('email'),
            'password' => Input::get('password'),
            'blocked'  => 0
        ];

        # Вход успешно произведён
		if(Auth::attempt($data))
            return Redirect::intended();

И, если email и пароль совпадут и в поле "blocked" содержится ноль, то пользователь успешно будет авторизован. Если что-либо не совпадёт, то Auth::attempt() вернёт "false". В этом-то и проблема, ведь Auth::attempt() возвращает только true или только false, и невозможно определить, запись ли блокирована или логин и пароль не совпали.

Думал повесить эту проверку на событие auth.login или auth.attempt, но не знаю, насколько это правильно.
В общем, подскажите самый правильный путь решения проблемы, как лучше это проверять?
Большое всем спасибо!

Не в сети

#2 24.06.2014 09:26:08

Re: Авторизация с проверкой дополнительных полей.

Смысл проверки attempt() именно в том, чтобы вернуть true или false, поэтому если вам нужно узнать точную причину (неверный пароль, блокировка и т.п.) — можно перед Auth::attempt() сначала найти этого пользователя в БД и проверить его на блокировку. То есть ещё до проверки пароля. Если нужно сделать это после — вызовите Auth::attempt(), если вход удался — проверьте на блокировку и в этом случае сразу сделайте Auth::logout().

Не вижу смысла изобретать какой-то особый велосипед.

Не в сети

#3 24.06.2014 13:28:11

Re: Авторизация с проверкой дополнительных полей.

А что мешает роуты прикрыть фильтром after с проверкой на блокировку? Авторизуем, но если пользователь заблокирован, то перекидываем на страницу "Вы заблокированы". К тому же, мультиаков так фиксировать можно через какую-нибудь неубиваемую куку.

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


Время, качество, цена - выбирай любые 2

Не в сети

#4 25.06.2014 10:47:51

Re: Авторизация с проверкой дополнительных полей.

Proger_XP, Agel_Nash, большое Вам спасибо за ответы. Ответ Proger_XP понятен предельно, а Agel_Nash, не могли бы Вы показать пример? Простите, если надоедаю smile

Не в сети

#5 26.06.2014 07:35:16

Re: Авторизация с проверкой дополнительных полей.

Route::group(array('before' => 'blocked'), function(){
    //Тут ваши маршруты Route::get/post/any/controller
});

Route::filter('blocked', function(){
    if(Auth::user() && Auth::user()->blocked == 1){
        App::abort(403); //Перекидываем на страницу доступ запрещен где написано что мол вы заблокированы
    }
});

Как-то так. Можно только на один маршрут login подвесить фильтрацию after и если пользователь заблокирован - то разавторизовывать его.

Изменено Agel_Nash (26.06.2014 07:39:19)


Время, качество, цена - выбирай любые 2

Не в сети

#6 26.06.2014 09:53:49

Re: Авторизация с проверкой дополнительных полей.

Agel_Nash, огромное Вам спасибо за ответ! Я задал вопрос, а потом дошло вроде, что нужно сделать так:

Можно только на один маршрут login подвесить фильтрацию after и если пользователь заблокирован - то разавторизовывать его.

Оказывается правильно мыслю smile.

Большое спасибо Вам обоим, Agel_Nash, Proger_XP ещё раз!

Не в сети

Подвал раздела