Symfony 5 - раздел администрирования формы входа, бесконечный цикл перенаправления - PullRequest
1 голос
/ 17 апреля 2020

В моем symfony веб-приложении должен быть раздел администратора, защищенный аутентификатором (AdminAuthenticator. php).

Я настроил этот раздел следующим образом в security.yaml:

security:
[...]
    firewalls:
[...]
        admin:
            pattern: ^/admin/
            guard:
                authenticators:
                    - App\Security\AdminAuthenticator
            logout:
                path: admin_logout
                # where to redirect after logout
                target: front_home
[...]
    access_control:
        - { path: ^/admin/login$, roles: IS_AUTHENTICATED_ANONYMOUSLY }

Перенаправление на форму работает, но когда форма должна быть показана, я получаю этот журнал:

Apr 17 14:57:10 |DEBUG| PHP    127.0.0.1:37778 Accepted path="/usr/bin/php7.4" php="7.4.4"
Apr 17 14:57:10 |INFO | REQUES Matched route "admin_login". method="GET" request_uri="http://lolhub.local:50004/admin/login" route="admin_login" route_parameters={"_controller":"App\\Controller\\Admin\\LoginController::login","_route":"admin_login"}
Apr 17 14:57:10 |DEBUG| SECURI Checking for guard authentication credentials. authenticators=1 firewall_key="admin"
Apr 17 14:57:10 |DEBUG| SECURI Checking support on guard authenticator. authenticator="App\\Security\\AdminAuthenticator"
Apr 17 14:57:10 |DEBUG| SECURI Guard authenticator does not support the request. 
Apr 17 14:57:10 |INFO | SECURI An AuthenticationException was thrown; redirecting to authentication entry point. 
Apr 17 14:57:10 |DEBUG| SECURI Calling Authentication entry point. 
Apr 17 14:57:10 |DEBUG| PHP    127.0.0.1:37778 Closing 

Это маршруты:

  admin_home_index             ANY      ANY      ANY    /admin/                            
  admin_login                  ANY      ANY      ANY    /admin/login                       
  admin_logout                 ANY      ANY      ANY    /admin/logout  

И это часть AdminAuthenticator. php:

class AdminAuthenticator extends AbstractFormLoginAuthenticator implements PasswordAuthenticatedInterface
{
    use TargetPathTrait;

    public const LOGIN_ROUTE = 'admin_login';

[...]

    public function supports(Request $request)
    {
        return self::LOGIN_ROUTE === $request->attributes->get('_route')
            && $request->isMethod('POST');
    }
[...]
    public function onAuthenticationSuccess(Request $request, TokenInterface $token, $providerKey)
    {
        if ($targetPath = $this->getTargetPath($request->getSession(), $providerKey)) {
            return new RedirectResponse($targetPath);
        }

        return new RedirectResponse($this->urlGenerator->generate('admin_home_index'));
        // For example : return new RedirectResponse($this->urlGenerator->generate('some_route'));
        // throw new \Exception('TODO: provide a valid redirect inside '.__FILE__);
    }
[...]
}

Я думал, - { path: ^/admin/login$, roles: IS_AUTHENTICATED_ANONYMOUSLY } не позволит брандмауэру заблокировать запрос формы входа.

Как я могу сказать symfony Не для того, чтобы обезопасить форму входа, чтобы я мог войти, прежде чем он проверит, аутентифицирован ли я?

1 Ответ

1 голос
/ 17 апреля 2020

Мне пришлось добавить строку с anonymous: lazy # or null

    security:
      [...]
          firewalls:
      [...]
              admin:
                  pattern: ^/admin/
    +             anonymous: lazy # or null
                  guard:
                      authenticators:
                          - App\Security\AdminAuthenticator
                  logout:
                      path: admin_logout
                      # where to redirect after logout
                      target: front_home
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...