Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
Здравствуйте. Пожалуйста, подскажите мне решение такого вопроса:
- Есть авторизация на сайте, написанном на 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, но не знаю, насколько это правильно.
В общем, подскажите самый правильный путь решения проблемы, как лучше это проверять?
Большое всем спасибо!
Не в сети
Смысл проверки attempt() именно в том, чтобы вернуть true или false, поэтому если вам нужно узнать точную причину (неверный пароль, блокировка и т.п.) — можно перед Auth::attempt() сначала найти этого пользователя в БД и проверить его на блокировку. То есть ещё до проверки пароля. Если нужно сделать это после — вызовите Auth::attempt(), если вход удался — проверьте на блокировку и в этом случае сразу сделайте Auth::logout().
Не в сети
А что мешает роуты прикрыть фильтром after с проверкой на блокировку? Авторизуем, но если пользователь заблокирован, то перекидываем на страницу "Вы заблокированы". К тому же, мультиаков так фиксировать можно через какую-нибудь неубиваемую куку.
На мой взгляд это лучше чем тупо ошибку вываливать еще на этапе авторизации.
Время, качество, цена - выбирай любые 2
Не в сети
Proger_XP, Agel_Nash, большое Вам спасибо за ответы. Ответ Proger_XP понятен предельно, а Agel_Nash, не могли бы Вы показать пример? Простите, если надоедаю
Не в сети
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
Не в сети
Agel_Nash, огромное Вам спасибо за ответ! Я задал вопрос, а потом дошло вроде, что нужно сделать так:
Можно только на один маршрут login подвесить фильтрацию after и если пользователь заблокирован - то разавторизовывать его.
Оказывается правильно мыслю .
Большое спасибо Вам обоим, Agel_Nash, Proger_XP ещё раз!
Не в сети
Страницы 1