Zend Framework 2 — проверка подлинности в абстрактном контроллере — & gt; onDispatch?

Я переписываю authentication процесс для моего приложения, работающего под ZF2,

Мне нужно иметь больше опций для аутентификации пользователя в зависимости от вызываемой службы.

И.Е. для веб-приложения, доступ к которому осуществляется через браузер, я буду проходить аутентификацию через Ldap, а для служб API я проверю учетные данные пользователя в заголовке.

Я создал abstract controller проверка подлинности пользователя; в противном случае он будет перенаправлен на страницу входа.

Все контроллеры в модулях, нуждающихся в одинаковом процессе аутентификации, расширят этот класс.

Мне нужно сохранить исходный запрос, чтобы перенаправить его обратно после успешного входа в систему.

Мои вопросы:

1. Является ли абстрактный контроллер -> метод onDispatch () правильным
место, чтобы разместить его?

Каждое решение, которое я нашел вокруг, всегда делало это в Module.php, Чтобы отличить метод auth, им нужно проверить, соответствует ли запрошенный контроллер, так как Module.php вызывается всегда. Разве это не «чище», чтобы установить его в контроллере?

2. Должен ли я использовать перенаправление или пересылку для перехода от оригинального контроллера
войти в контроллер и затем вернуться?

Я не возражаю против изменения URL-адреса в панели браузера, просто ищу лучшее и самое быстрое решение, сохраняя при этом оригинальный запрос.

3. Правильно ли хранить URI в классе сеанса (из
модуль аутентификации)? Есть ли способ сохранить весь запрос (включая, может быть, данные POST в случае необходимости)?

Вот абстрактный контроллер:

abstract class AbstractAuthActionController extends AbstractActionController {

public function onDispatch(MvcEvent $e) {
$serviceManager = $e->getApplication ()->getServiceManager ();
$auth = $serviceManager->get ( 'LdapAuth\Client\Ldap' );
if (! $auth->hasIdentity ()) {
$uri = $e->getRequest()->getRequestUri();
$callBackFunction = $this->getLdap ()->getCallBackFunction (); // = new SessionData();
$callBackFunction::setOriginalUri($uri); // function to store temporarly the uri
return $this->redirect ()->toRoute ( 'ldap-login-route' );
} else {
return parent::onDispatch ( $e );
}
}
}

1

Решение

  1. Многие люди делают это, потому что они хотят позаботиться о проверке аутентификации перед контроллером dispatch событие. Аутентификация может быть проверена намного раньше в процессе, например, на route событие, или, по крайней мере, до того, как был создан экземпляр контроллера (отправка с более высоким приоритетом, чем у контроллера).

    Если пользователь не прошел проверку подлинности, вы хотите ответить 401 (несанкционированный) или 403 (запрещено) или 302 (временно перемещен) ответ (прочитайте дополнительную информацию об этом коде состояния здесь в вики) как можно раньше, чтобы предотвратить все накладные расходы, которые только удерживают ваш сервер (излишне) занятыми и, таким образом, замедляют работу вашего приложения и задерживают неаутентифицированное ответ.

    module.php является НЕ лучшее место, чтобы добавить все authentication связанный код. Лучше было бы создать прослушиватель проверки подлинности (и внедрить службу проверки подлинности в прослушивателе) и подключить только прослушиватель в вашем module.php,

  2. Читайте о разнице между перенаправлением и пересылкой вот в этом ответе. Если хотите перенаправить клиента, то это не правильно authenticated в ответ с 302 код состояния вам нужно будет отправить ответ перенаправления, включая этот код состояния. Я также вижу людей, использующих forward в таких случаях, но, на мой взгляд, это не правильно, потому что клиент не будет уведомлен о каком-либо перенаправлении. Вы также можете проверить модули аутентификации, такие как ZfcUser чтобы увидеть, как они справляются с этим.

  3. Вам не нужно хранить этот URL-адрес на сервере, вы можете отправить URL-адрес, на который хотите перейти, после входа в систему (исходный URL-адрес) внутри ответа на перенаправление. Например, вы перенаправляете на login.php из запроса, направленного на profile.php, тогда ваш URL перенаправления может выглядеть так:

    http://www.example.com/login.php?redirect=profile.php

    Теперь вы можете установить перенаправление внутри процесса / контроллера входа в систему, чтобы после успешного входа вы возвращали клиента в profile.php,

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]