CakePHP 4: Отсутствует URL-адрес маршрута CakePHP

Я использую плагин аутентификации для входа в cakephp.

application.php , код метода configAuth()

protected function configAuth(): \Authentication\AuthenticationService
    {
        $authenticationService = new \Authentication\AuthenticationService([
            // 'unauthenticatedRedirect' => '/cake_invo/users/login' , //<= manually working fine
            'unauthenticatedRedirect' => \Cake\Routing\Router::url(['controller' => 'Users', 'action' => 'login']),
            'queryParam' => 'redirect',
        ]);

        // Load identifiers, ensure we check email and password fields
        $authenticationService->loadIdentifier('Authentication.Password', [
            'fields' => [
                'username' => 'email',
                'password' => 'password',
            ]
        ]);

        // Load the authenticators, you want session first
        $authenticationService->loadAuthenticator('Authentication.Session');
        // Configure form data check to pick email and password
        $authenticationService->loadAuthenticator('Authentication.Form', [
            'fields' => [
                'username' => 'email',
                'password' => 'password',
            ],
            // 'loginUrl' => '/cake_invo/users/login'  //<= manually working fine
            'loginUrl' => \Cake\Routing\Router::url(['controller' => 'Users', 'action' => 'login']),
        ]);

        return $authenticationService;
    }

промежуточный метод

public function middleware(MiddlewareQueue $middlewareQueue): MiddlewareQueue
    {
        $middlewareQueue

            ->add(new ErrorHandlerMiddleware(Configure::read('Error')))

            ->add(new AssetMiddleware([
                'cacheTime' => Configure::read('Asset.cacheTime'),
            ]))

            ->add(new RoutingMiddleware($this))
            // add Authentication after RoutingMiddleware
            ->add(new \Authentication\Middleware\AuthenticationMiddleware($this->configAuth()));

        return $middlewareQueue;
    }

Получение ошибки, похожей на изображение

введите здесь описание изображения

Как я могу решить эту проблему ?

После передачи командных маршрутов bin/cake

введите здесь описание изображения


person Niloy Rony    schedule 04.02.2020    source источник
comment
Вы протестировали его с помощью 'unauthenticatedRedirect' => '/users/login' и 'loginUrl' => '/users/login', чтобы увидеть, работает ли он. Тогда вы будете знать, является ли это обратной маршрутизацией, ошибкой или маршрутизацией. Также, если вы можете показать нам еще немного кода и, возможно, Var_dump Router::url(['controller' =› 'Users', 'action' =› 'login']). Маршруты настраиваются явно в src\config\routes.php, но, исходя из опыта, вам не нужно вручную связывать комбинации контроллер/действие.   -  person Gregory William Bryant    schedule 04.02.2020
comment
Мой проект в подкаталоге, поэтому я следовал этому ответу stackoverflow.com/questions/59065494/   -  person Niloy Rony    schedule 04.02.2020
comment
Всякий раз, когда у вас возникают проблемы с маршрутами, сначала проверьте, какие именно маршруты подключены и в каком порядке, например, с помощью команды route: bin/cake routes. При этом, где именно в списке промежуточных программ вы добавляете промежуточное программное обеспечение аутентификации (добавьте свой код Application::middleware() к своему вопросу, если вы не уверены, о чем я говорю)?   -  person ndm    schedule 04.02.2020
comment
@ndm Спасибо за ваш комментарий, я обновил вопрос.   -  person Niloy Rony    schedule 05.02.2020
comment
В CakePHP версии 4 он указывал, если отсутствовал файл контроллера Users, и Action, login. Если, возможно, это более старые версии, они просто указывают на отсутствующий маршрут? У вас есть контроллер и действие? Также вы пробовали 'loginUrl' => \Cake\Routing\Router::url('/users/login'). Наконец, что происходит, когда вы идете по маршруту вручную? Что отображается в URL-адресе браузера для этого изображения ошибки?   -  person Gregory William Bryant    schedule 05.02.2020
comment
Также руководство, которому вы следуете, предназначено для более ранней версии CakePHP (book.cakephp .org/authentication/1/en/index.html) Аутентификация в CakePHP 4.0 осуществляется с помощью $this-›loadComponent('Auth'). Похоже, вы используете старые ресурсы, которые сбивают вас с толку.   -  person Gregory William Bryant    schedule 05.02.2020
comment
@GregoryWilliamBryant, когда я использовал 'loginUrl' => \Cake\Routing\Router::url('/users/login'), маршрут работает нормально, но проблема в том, что я не могу войти в систему. После отладки я получаю сообщение об ошибке «URL-адрес входа http://localhost/cake_invo/Users/login не соответствует /users/login».   -  person Niloy Rony    schedule 05.02.2020
comment
Когда вы говорите, что не можете войти в систему, какую ошибку вы получаете как пользователь? Возможно, проблема с учетом регистра с пользователями и пользователями.   -  person Gregory William Bryant    schedule 05.02.2020
comment
@GregoryWilliamBryant тот же код работает нормально, если я запускаю сервер тортов и использую сервер тортов. Я хочу использовать его без сервера тортов. Проблема с верхним и нижним регистром Я проверил тот же результат. Я на локальном хосте.   -  person Niloy Rony    schedule 05.02.2020
comment
У вас есть .htaccess, который вы перезаписываете? Вы хотите сказать, что «все» ваши проблемы исчезнут, когда вы воспользуетесь сервером тортов? Если это так, это звучит как проблема с перезаписью URL-адреса с помощью xamp, что указывает на проблему с конфигурацией .htaccess.   -  person Gregory William Bryant    schedule 05.02.2020
comment
@NiloyRony Я упоминаю ваш код метода middleware(), код, в котором вы делаете ->add(new AuthenticationMiddleware($this)), вы, вероятно, не добавляете вещи в требуемом порядке. Ваши маршруты выглядят нормально.   -  person ndm    schedule 05.02.2020
comment
@ndm Я обновил метод промежуточного программного обеспечения, спасибо.   -  person Niloy Rony    schedule 05.02.2020


Ответы (1)


Проблема в том, что ваши маршруты еще не загружены, когда вы делаете вызов Router::url(), поэтому он не работает.

В то время как порядок промежуточных программ правильный, т. е. промежуточные программы аутентификации добавляются после промежуточных программ маршрутизации, вы создаете службу аутентификации немедленно, вызывая $this->configAuth(), что означает, что вызов Router::url() будет вызываться до запуска любого из промежуточных программ, в частности до запуска промежуточного программного обеспечения маршрутизации, которое отвечает за загрузку ваших маршрутов.

Вместо передачи встроенного экземпляра службы проверки подлинности настройте как показано на docs, то есть убедитесь, что ваш класс Application реализует \Authentication\AuthenticationServiceProviderInterface, измените метод configAuth, чтобы он соответствовал AuthenticationServiceProviderInterface::getAuthenticationService(), а затем вместо этого передайте $this в конструктор промежуточного программного обеспечения аутентификации. Таким образом, метод будет вызываться только при запуске промежуточного ПО аутентификации, то есть после промежуточного ПО маршрутизации.

// ...
use Authentication\AuthenticationServiceInterface;
use Authentication\AuthenticationServiceProviderInterface;
use Cake\Http\BaseApplication;
use Psr\Http\Message\ServerRequestInterface;

class Application extends BaseApplication implements AuthenticationServiceProviderInterface
{
    // ...

    public function getAuthenticationService(ServerRequestInterface $request): AuthenticationServiceInterface
    {
        // ...
        return $authenticationService;
    }

    public function middleware(MiddlewareQueue $middlewareQueue): MiddlewareQueue
    {
        $middlewareQueue
            // ...
            ->add(new RoutingMiddleware($this))
            ->add(new AuthenticationMiddleware($this));

        return $middlewareQueue;
    }

    // ...
}
person ndm    schedule 05.02.2020