После успешного входа я хочу, чтобы меня перенаправили на экран, на котором я был до входа в систему. getLoginRedirect() не работает

Предположим, вы были на экране списка пользователей. Оттуда вы перейдете к экрану входа, чтобы войти в систему. Там вы введете свой адрес электронной почты и пароль и нажмите кнопку отправки. Вы успешно вошли в систему. Если вход в систему выполнен успешно, мы хотим быть перенаправлены на экран со списком пользователей.

Если вы были на экране сведений о пользователе, вы будете перенаправлены на экран сведений о пользователе, нажав Если пользователь находился на экране редактирования, экран редактирования пользователя

Я прочитал документацию AuthenticationPlugin на book.cakephp.org. Там я научился использовать getLoginRedirect() для достижения этой функциональности.

Я знаю, что то, что я хочу сделать, произойдет после того, как я настрою шаги, описанные ниже.

Однако getLoginRedirect() возвращает null.

Что мне нужно делать? Что мне не хватает? В чем дело?


// in Application.php

public function getAuthenticationService(ServerRequestInterface $request): AuthenticationServiceInterface
    {
        $path = $request->getPath();
        $authenticationService = new AuthenticationService([
            'unauthenticatedRedirect' => '/',
            'queryParam' => 'redirect',                // <- I believe this is the only one that matters.
        ]);

       // Abbreviated below....
}
  


// in UsersController 

public function login()
    {
        $this->request->allowMethod(['get', 'post']);

        if ($this->request->is('post')) {
            $result      = $this->Authentication->getResult();
            $requestData = $this->request->getData();

            if ($result->isValid()) {

                // I want to get the original url. But null is passed.
                $redirect = $this->Authentication->getLoginRedirect() ?? '/';

                return $this->redirect($redirect);
            }

            if ($this->request->is('post') && !$result->isValid()) {
                $this->Flash->error(__('メールアドレス、またはパスワードが間違っています。'));
            }
        }
    }

Думаю, я раскрыл все, что связано с getLoginRedirect(). Если чего-то не хватает или что-то, что вам интересно, пожалуйста, дайте мне знать.

Пожалуйста, помогите мне. Пожалуйста, помогите мне...

🤔 А знаете ли вы, что...
CakePHP обеспечивает гибкую маршрутизацию URL и контроль доступа.


326
1

Ответ:

Решено

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

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

$service = $this->request->getAttribute('authentication');
// here `$queryParam` would by default be `redirect`
$queryParam = $service->getConfig('queryParam');

echo $this->Html->link('Login', [
    'plugin' => null,
    'prefix' => false,
    'controller' => 'Users',
    'action' => 'login',
    '?' => [
        $queryParam => $this->request->getRequestTarget(),
    ],
]);

Итак, если вы находитесь на /users/show, URL-адрес ссылки для входа будет выглядеть примерно так:

/login?redirect=/users/show

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

Смотрите также