CakePHP3: как использовать разные механизмы аутентификации?

У меня есть стандартная аутентификация формы, объявленная в AppController.php:

    $this->loadComponent('Auth', [
        'authorize' => ['Controller'],
        'authenticate' => [
           'Form' => [
                'scope' => ['Users.active' => 1]
            ]
        ],
        'loginRedirect' => [
           'controller' => 'Users',
           'action' => 'account'
        ],
        'logoutRedirect' => [
            'controller' => 'Index',
            'action' => 'index'
        ]
    ]);

Теперь мне нужна аутентификация на основе api_key в веб-сервисе. В документе объясняется, как это сделать. как это:

$this->loadComponent('Auth', [
    'authenticate' => [
        'Basic' => [
           'fields' => ['username' => 'username', 'password' => 'api_key'],
            'userModel' => 'Users'
        ],
    ],
    'storage' => 'Memory',
    'unauthorizedRedirect' => false
]);

Итак, теперь мне интересно, как загрузить второй механизм аутентификации в моем веб-сервисе. Я пытался сделать это:

class DeviceconnectionsController extends AppController
{

    public function initialize()
    {
        parent::initialize();
        $this->loadComponent('RequestHandler');

        $this->loadComponent('Auth', [
                'authenticate' => [
                        'Basic' => [
                                'fields' => ['username' => 'username', 'password' => 'api_key'],
                                'userModel' => 'Users'
                        ],
                ],
                'storage' => 'Memory',
                'unauthorizedRedirect' => false
        ]);
    }
    ....
}

Но Cake жалуется, что я пытаюсь перезагрузить другой компонент аутентификации. Так что, возможно, правильный способ — загрузить оба механизма аутентификации в AppController.php, как показано ниже:

    $this->loadComponent('Auth', [
        'authorize' => ['Controller'],
        'authenticate' => [
           'Form' => [
                'scope' => ['Users.active' => 1]
            ],
            'Basic' => [
                'fields' => ['username' => 'username', 'password' => 'api_key'],
                'userModel' => 'Users'
            ],
        ],
        'loginRedirect' => [
           'controller' => 'Users',
           'action' => 'account'
        ],
        'logoutRedirect' => [
            'controller' => 'Index',
            'action' => 'index'
        ]
    ]);

Но это кажется неверным, поскольку обе аутентификации используют разные настройки storage и unauthorizedRedirect.

Как сделать?


person fralbo    schedule 29.02.2016    source источник
comment
Как вы думаете, почему это было бы неверно? Вы тоже пробовали? Если да, то в чем именно проблема? Также проверьте book.cakephp.org /3.0/en/controllers/components/, в нем указано, как обрабатываются несколько обработчиков аутентификации, и показано, как их настроить (это делается так же, как в вашем примере)   -  person ndm    schedule 01.03.2016
comment
@ndm, потому что по умолчанию loadComponent() настраивает storage на session, а для базовой аутентификации по ключу API storage следует установить на memory. И я не вижу, как изменить этот параметр.   -  person fralbo    schedule 01.03.2016
comment
Basic аутентификация не обязательно требует использования хранилища Memory, вы, конечно, также можете использовать хранилище Session, которое, однако, сделает его сохраняющим состояние. Если вам действительно нужна аутентификация с сохранением состояния и без сохранения состояния, укажите это в своем вопросе и объясните свой сценарий немного подробнее, т.е. зачем вам обе? ресурсы (контроллеры/действия)? и т.д...   -  person ndm    schedule 01.03.2016
comment
@ndm спасибо, мне это особо не нужно. Я только что понял, что это необходимая настройка для базовой аутентификации через доступ к API. А по факту апи доступ к конкретным ресурсам.   -  person fralbo    schedule 01.03.2016
comment
@ndm На самом деле я думаю, что мне нужна аутентификация как с сохранением состояния, так и без него. Один по умолчанию (форма) для обычного веб-доступа и один (базовый) для доступа API к некоторым ресурсам, и последний мне нужен 'unauthorizedRedirect' => false. И я не знаю, как его установить.   -  person fralbo    schedule 01.03.2016
comment
Перекрываются ли эти некоторые ресурсы с ресурсами, которые должны использовать проверку подлинности с отслеживанием состояния? Потому что это на самом деле было бы довольно сложно, я думаю.   -  person ndm    schedule 01.03.2016
comment
@ндм. Я полагаю, мы можем сказать, что это тот же базовый URL-адрес и контроллеры API, которые расширяют AppController. Нужен ли мне APIController, который, возможно, расширяет контроллер?   -  person fralbo    schedule 01.03.2016
comment
Пока речь идет только о расширении общих контроллеров, для которых уже настроена аутентификация, все должно быть в порядке, так как вы можете просто перенастроить его stackoverflow.com/questions/35555876/. Конечно, вы также можете создать дополнительные базовые контроллеры, которые расширяются от AppController, чтобы не нужно было загружать туда аутентификацию.   -  person ndm    schedule 01.03.2016