Использование Cake PHP Form и Basi c Authentication вместе - PullRequest
0 голосов
/ 02 февраля 2020

Я создал простой тестовый сайт, используя Cake PHP 3.8 и Authentication 1.0, чтобы опробовать его. Я хотел бы использовать как аутентификацию по форме, так и по Basi c, поскольку предполагаемое приложение будет предлагать вызовы REST.

Сайт работает правильно, если не включен HttpBasi c, то есть окно входа в систему , Однако с помощью HttpBasi c сайт переходит непосредственно к базовой аутентификации 1013 *.

Код взят непосредственно из поваренной книги.

Чего мне не хватает?

    public function getAuthenticationService(ServerRequestInterface $request, ResponseInterface $response)
{
    $service = new AuthenticationService();

    $service->setConfig([
            'unauthenticatedRedirect' => '/users/login',
            'queryParam' => 'redirect'
    ]);

    $fields = [
        'username' => 'user',
        'password' => 'password',
    ];

    // Load Identifiers
    $service->loadIdentifier('Authentication.Password', compact('fields'));

    // Load the authenticators
    $service->loadAuthenticator('Authentication.Session');
    $service->loadAuthenticator('Authentication.Form', [
            'fields' => $fields,
            'loginUrl' => '/users/login',
    ]);
    $service->loadAuthenticator('Authentication.HttpBasic');

    return $service;
}

1 Ответ

0 голосов
/ 02 февраля 2020

Как уже упоминалось в комментариях, совместное использование средства проверки подлинности формы и HTTP-основы c не будет работать должным образом, это связано с тем, что служба проверки подлинности не прекратит выполнение всех загруженных средств проверки подлинности, кроме одного. из них возвращает ответ, который указывает на успешную аутентификацию.

Это означает, что вы всегда будете представлены с ответом на запрос аутентификации и никогда не увидите свою форму входа. Только фактическая часть аутентификации будет работать в этом созвездии, ie напрямую отправляя ваши учетные данные для входа в качестве данных формы в конечную точку входа в систему.

Если вам на самом деле не нужен базовый c ответ на запрос проверки подлинности, который не позволяя вам получить доступ к форме входа в систему, вы можете использовать специальный / расширенный аутентификатор, который не вызывает ответ на запрос, который должен быть таким же простым, как переопределение \Authentication\Authenticator\HttpBasicAuthenticator::unauthorizedChallenge():

src /Authenticator/ChallengelessHttpBasicAuthenticator.php

namespace App\Authenticator;

use Authentication\Authenticator\HttpBasicAuthenticator;
use Psr\Http\Message\ServerRequestInterface;

class ChallengelessHttpBasicAuthenticator extends HttpBasicAuthenticator
{
    public function unauthorizedChallenge(ServerRequestInterface $request)
    {
        // noop
    }
}
$service->loadAuthenticator(\App\Authenticator\ChallengelessHttpBasicAuthenticator::class);

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

$provider = $this->Authentication->getAuthenticationService()->getAuthenticationProvider();
if (!($provider instanceof \Authentication\Authenticator\StatelessInterface))
{
    $this->Authentication->setIdentity(/* ... */);
}
...