Как использовать аутентификацию приложения в Apigility?

Мой вариант использования аутентификации довольно прост. Я использую свой API только сам во внешнем интерфейсе своего приложения ZF, когда пользователь вошел в систему. Поэтому любой из предоставленных адаптеров аутентификации кажется мне излишним. Мне вообще не нужен API для запроса учетных данных.

Я хочу использовать идентификатор, указанный в сеансе браузера. Если пользователь вошел в систему, API должен быть доступен, иначе нет.

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

В моем приложении используются ZfcUser и ZfcRbac для управления ролями и удостоверениями.


person Rob    schedule 24.08.2015    source источник
comment
Rest — это архитектура без состояния. Что вы подразумеваете под сеансом браузера? Ваш API НИКОГДА НЕ ДОЛЖЕН использовать/зависеть/читать/записывать сеанс или файл cookie. en.wikipedia.org/wiki/Representational_state_transfer#Stateless   -  person edigu    schedule 26.08.2015
comment
@foozy Я прекрасно об этом знаю. Хотите сделать это в любом случае. Мой API предназначен только для запросов JavaScript во внешнем интерфейсе моего веб-приложения.   -  person Rob    schedule 26.08.2015


Ответы (1)


Это действительно кажется труднодостижимым, поскольку Apigility использует собственные модели удостоверений, предоставляемые zf-mvc-auth, которые несовместимы с удостоверениями ZfcUser. Таким образом, простое переключение службы аутентификации не помогло.

Теперь я нашел решение, хотя и негибкое. В Module.php моего приложения я присоединяю прослушиватель событий к событию EVENT_AUTHORIZATION zf-mvc-auth и просто изменяю авторизованное состояние самого события.

Не очень круто, но работает до тех пор, пока вы должны отличать статус гостя от всего остального. Роли так не работают.

public function onBootstrap(MvcEvent $e)
{
    $serviceManager = $e->getApplication()->getServiceManager();

    $eventManager->attach(
        MvcAuthEvent::EVENT_AUTHORIZATION,
        function(MvcAuthEvent $mvcAuthEvent) use ($serviceManager)
        {
            $authService = $serviceManager->get('Zend\Authentication\AuthenticationService');

            if ($authService->hasIdentity()) {
                $mvcAuthEvent->setIsAuthorized(true);
            }
        },
        100
    );
}
person Rob    schedule 03.09.2015