Laravel по-русски

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

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

#1 22.08.2016 17:25:02

Свой метод Auth::attempt

Привет всем)

В AuthController мне нужно использовать свой метод Auth::attempt(). Мне надо проверять на то, подтвержден ли у юзера email. То есть в табличке users дополнительное поле... это не важно)) Поэтому мне нужен свой метод Auth::attempt(), который не просто возвращает TRUE/FALSE, а возвращает например, что юзер есть, но не подтвержден... для вывода разных ошибок.

Как сделать?, что переопределять? Нужно ли делать свой драйвер аутентификации? Как сделать правильно, подскажите, мастера)

Изменено grungestranger (22.08.2016 17:25:53)

Не в сети

#2 22.08.2016 17:28:59

Re: Свой метод Auth::attempt

Зачем усложнять? Если в таблице users есть поле verified, можно просто проводить проверку:

if (Auth::user()->verified)

Не в сети

#3 22.08.2016 17:36:59

Re: Свой метод Auth::attempt

AlexeyMezenin пишет:

Зачем усложнять? Если в таблице users есть поле verified, можно просто проводить проверку:

if (Auth::user()->verified)

Это первое, что приходит в голову) Но это скорее - костыль) К тому же срабатывает аутентификация, в remember_token записывается токен, а потом, если юзер не verified, надо делать auth()->logout() . Кроме того мне это не подходит, так как именно в remember_token, я записываю хеш, который отсылаю в письме для подтверждения (тоже похоже на костыль, но неохото делать лишнее поле в табличке, которое часто будет пустым).

Не в сети

#4 22.08.2016 17:52:36

Re: Свой метод Auth::attempt

Middleware твой путь, о падаван!)))
там проверил и куда-надо переадресовал, или флаг какой-нить придумал...
Вариаций море smile

Не в сети

#5 22.08.2016 18:02:07

Re: Свой метод Auth::attempt

hzone пишет:

Middleware твой путь, о падаван!)))
там проверил и куда-надо переадресовал, или флаг какой-нить придумал...
Вариаций море smile

Мне не нужен флаг, мне нужно, чтобы, если email не подтвержден, авторизация не срабатывала.
Я могу даже передать в $credentials - 'confirmed' => 1, и это будет работать, но я не узнаю из-за чего не прошла авторизация (либо нет вообще такого юзера, либо не подтвержден email).

Не в сети

#6 22.08.2016 18:03:36

Re: Свой метод Auth::attempt

grungestranger пишет:

если юзер не verified, надо делать auth()->logout()

Это не костыль, это обычная проверка. Если нужно совершать действия наподобие logout, то здесь middleware и делать проверку как я написал выше (или подобным образом).

но я не узнаю из-за чего не прошла авторизация (либо нет вообще такого юзера, либо не подтвержден email

Что мешает сделать поле verified и добавить туда несколько типов (0 - не проверен, т.к. не подтвержден емэйл, 1 - проверен емэйл, 2 - еще что-то и т.д.)?

Изменено AlexeyMezenin (22.08.2016 18:05:33)

Не в сети

#7 22.08.2016 20:33:25

Re: Свой метод Auth::attempt

grungestranger пишет:
hzone пишет:

Middleware твой путь, о падаван!)))
там проверил и куда-надо переадресовал, или флаг какой-нить придумал...
Вариаций море smile

Мне не нужен флаг, мне нужно, чтобы, если email не подтвержден, авторизация не срабатывала.
Я могу даже передать в $credentials - 'confirmed' => 1, и это будет работать, но я не узнаю из-за чего не прошла авторизация (либо нет вообще такого юзера, либо не подтвержден email).

Middleware; Auth::check(); Auth::user->is_validated == false ? redirect : closure->next;
надеюсь подсказки помогут

Не в сети

#8 22.08.2016 21:59:32

Re: Свой метод Auth::attempt

Такое ощущение, что вы не совсем поняли о чем идет речь.

Мне не нужны middleware. Мне не нужно никакое определение каждый запрос.
Я переопределяю метод login() (он из какого-то трейта) в AuthController. То есть метод, когда человек ввел свой логин/email и пароль. И в этом методе, если все удачно, он записывается в сессию и будет авторизован, иначе нет. Зачем мне какие-то middleware использовать? когда все делается в одном методе. Зачем мне какая-то проверка Auth::check(); Auth::user->is_validated == false ? redirect : closure->next; Когда, если в методе login() проверка прошла, то все, человек авторизован, и далее мне никаких проверок не нужно, пока сессия не закончится, и ему заново не нужно будет вводить свои логин и пароль.

Изменено grungestranger (22.08.2016 22:04:14)

Не в сети

#9 23.08.2016 17:03:58

Re: Свой метод Auth::attempt

Нашел хороший выход, поделюсь им))

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)

Не в сети

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