Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
Привет всем)
В AuthController мне нужно использовать свой метод Auth::attempt(). Мне надо проверять на то, подтвержден ли у юзера email. То есть в табличке users дополнительное поле... это не важно)) Поэтому мне нужен свой метод Auth::attempt(), который не просто возвращает TRUE/FALSE, а возвращает например, что юзер есть, но не подтвержден... для вывода разных ошибок.
Как сделать?, что переопределять? Нужно ли делать свой драйвер аутентификации? Как сделать правильно, подскажите, мастера)
Изменено grungestranger (22.08.2016 17:25:53)
Не в сети
Зачем усложнять? Если в таблице users есть поле verified, можно просто проводить проверку:
if (Auth::user()->verified)
Не в сети
Зачем усложнять? Если в таблице users есть поле verified, можно просто проводить проверку:
if (Auth::user()->verified)
Это первое, что приходит в голову) Но это скорее - костыль) К тому же срабатывает аутентификация, в remember_token записывается токен, а потом, если юзер не verified, надо делать auth()->logout() . Кроме того мне это не подходит, так как именно в remember_token, я записываю хеш, который отсылаю в письме для подтверждения (тоже похоже на костыль, но неохото делать лишнее поле в табличке, которое часто будет пустым).
Не в сети
Middleware твой путь, о падаван!)))
там проверил и куда-надо переадресовал, или флаг какой-нить придумал...
Вариаций море
Не в сети
Middleware твой путь, о падаван!)))
там проверил и куда-надо переадресовал, или флаг какой-нить придумал...
Вариаций море
Мне не нужен флаг, мне нужно, чтобы, если email не подтвержден, авторизация не срабатывала.
Я могу даже передать в $credentials - 'confirmed' => 1, и это будет работать, но я не узнаю из-за чего не прошла авторизация (либо нет вообще такого юзера, либо не подтвержден email).
Не в сети
если юзер не verified, надо делать auth()->logout()
Это не костыль, это обычная проверка. Если нужно совершать действия наподобие logout, то здесь middleware и делать проверку как я написал выше (или подобным образом).
но я не узнаю из-за чего не прошла авторизация (либо нет вообще такого юзера, либо не подтвержден email
Что мешает сделать поле verified и добавить туда несколько типов (0 - не проверен, т.к. не подтвержден емэйл, 1 - проверен емэйл, 2 - еще что-то и т.д.)?
Изменено AlexeyMezenin (22.08.2016 18:05:33)
Не в сети
hzone пишет:Middleware твой путь, о падаван!)))
там проверил и куда-надо переадресовал, или флаг какой-нить придумал...
Вариаций мореМне не нужен флаг, мне нужно, чтобы, если email не подтвержден, авторизация не срабатывала.
Я могу даже передать в $credentials - 'confirmed' => 1, и это будет работать, но я не узнаю из-за чего не прошла авторизация (либо нет вообще такого юзера, либо не подтвержден email).
Middleware; Auth::check(); Auth::user->is_validated == false ? redirect : closure->next;
надеюсь подсказки помогут
Не в сети
Такое ощущение, что вы не совсем поняли о чем идет речь.
Мне не нужны middleware. Мне не нужно никакое определение каждый запрос.
Я переопределяю метод login() (он из какого-то трейта) в AuthController. То есть метод, когда человек ввел свой логин/email и пароль. И в этом методе, если все удачно, он записывается в сессию и будет авторизован, иначе нет. Зачем мне какие-то middleware использовать? когда все делается в одном методе. Зачем мне какая-то проверка Auth::check(); Auth::user->is_validated == false ? redirect : closure->next; Когда, если в методе login() проверка прошла, то все, человек авторизован, и далее мне никаких проверок не нужно, пока сессия не закончится, и ему заново не нужно будет вводить свои логин и пароль.
Изменено grungestranger (22.08.2016 22:04:14)
Не в сети
Нашел хороший выход, поделюсь им))
AuthController, метод login()
...
$auth = Auth::guard($this->getGuard());
if ($auth->attempt($credentials, false, false)) {
$user = $auth->getLastAttempted();
if ($user->confirmed) {
$auth->login($user, $request->has('remember'));
return $this->handleUserWasAuthenticated($request, $throttles);
} else {
...
}
}
...
Фокус в том, что объект гарда позволяет не авторизовывать юзера в методе attempt(), путем передачи 3-го параметра - $login = FALSE.
И мы можем получить юзера, найденного по логину и паролю, методом getLastAttempted() нашего гарда. И соответственно есть метод login() у гарда. Удается все сделать красиво и правильно, без лишних событий авторизации и т.д.
Изменено grungestranger (23.08.2016 17:06:53)
Не в сети
Страницы 1