Symfony - Guard Authenticator потерял пользователя после успешного входа в систему

Я реализую систему входа в систему с защитной аутентификацией в моем приложении Symfony. Я уже начал внедрять систему, но что-то делаю неправильно.

Я начну с демонстрации того, что я реализовал, а в конце объясню, что происходит ...

security.yml

security:
    encoders:
        UserBundle\Entity\User: bcrypt

    providers:  
        custom_own_provider:
            entity:
                class: UserBundle:User

    firewalls:
        dev:
            pattern: ^/(_(profiler|wdt)|css|images|js)/
            security: false

        custom:
            pattern: ^/ad/
            anonymous: ~
            provider: custom_own_provider
            remember_me:
                name: 'nothing'
                secure: true
                httponly: true
                secret:   '%secret%'
                lifetime: 604800 # 1 week in seconds
                path:     /
                domain:   ~
            guard:
                authenticators:
                    - app.authenticator.form        

services.yml

services:
    app.authenticator.form:
        class: UserBundle\Security\LoginFormAuthenticator
        autowire: true
        arguments: ["@service_container"]

LoginController

/**
 * @Route("/login", name = "login")
 */
public function loginAction(Request $request) {

    $authenticationUtils = $this->get('security.authentication_utils');

    $error = $authenticationUtils->getLastAuthenticationError();
    $lastUsername = $authenticationUtils->getLastUsername();

    return $this->render(
        'AppBundle:login:index.html.twig',
        [
            'error' => $error ? $error->getMessage() : NULL,
            'last_username' => $lastUsername
        ]
    );
}

Публичный контроллер с домашней страницей: после успешного входа пользователь перенаправляется сюда. Бывает, что здесь при проверке подлинности пользователя я не добился успеха. "getuser" из токена безопасности возвращает "anon".

 /**
 * @Route("/", name = "homepage")
 */

public function publicHomepageAction (){
    // DEBUG: This method gets a user from the Security Token Storage. The user here comes as 'anon'. 
$user = $this->getUser();

// If user is already logged show internal homepage
    $securityContext = $this->container->get('security.authorization_checker');
    if ($securityContext->isGranted('IS_AUTHENTICATED_REMEMBERED')
        || $securityContext->isGranted('IS_AUTHENTICATED_FULLY')
    ){
        // Code if user is authenticated
        ...
    }

    return $this->render('splash_page/homepage.html.twig');
}

И, наконец, мой FormAuthenticator:

class LoginFormAuthenticator extends AbstractGuardAuthenticator
{
    private $container;

    /**
     * Default message for authentication failure.
     *
     * @var string
     */
    private $failMessage = 'Invalid credentials';

    /**
     * Creates a new instance of FormAuthenticator
     */
    public function __construct(ContainerInterface $container)
    {
        $this->container = $container;
    }

    /**
     * {@inheritdoc}
     */
    public function getCredentials(Request $request)
    {
        if ($request->getPathInfo() != '/login' || !$request->isMethod('POST')) {
            return;
        }

        return array(
            'email' => $request->request->get('email'),
            'password' => $request->request->get('password'),
        );
    }

    /**
     * {@inheritdoc}
     */
    public function getUser($credentials, UserProviderInterface $userProvider)
    {
        $email = $credentials['email'];

        return $userProvider->loadUserByUsername($email);
    }

    /**
     * {@inheritdoc}
     */
    public function checkCredentials($credentials, UserInterface $user)
    {
        $plainPassword = $credentials['password'];
        $encoder = $this->container->get('security.password_encoder');

        if (!$encoder->isPasswordValid($user, $plainPassword)) {
            throw new CustomUserMessageAuthenticationException($this->failMessage);
        }

        return true;
    }

    /**
     * {@inheritdoc}
     */
    public function onAuthenticationSuccess(Request $request, TokenInterface $token, $providerKey)
    {
        $url = $this->container->get('router')->generate('homepage');
        return new RedirectResponse($url);
    }

    /**
     * {@inheritdoc}
     */
    public function onAuthenticationFailure(Request $request, AuthenticationException $exception)
    {
        $request->getSession()->set(Security::AUTHENTICATION_ERROR, $exception);
        $url = $this->container->get('router')->generate('login');
        return new RedirectResponse($url);
    }

    /**
     * {@inheritdoc}
     */
    public function start(Request $request, AuthenticationException $authException = null)
    {
        $url = $this->container->get('router')->generate('login');
        return new RedirectResponse($url);
    }

    /**
     * {@inheritdoc}
     */
    public function supportsRememberMe()
    {
        return true;
    }

    /**
     * Does the authenticator support the given Request?
     *
     * If this returns false, the authenticator will be skipped.
     *
     * @param Request $request
     *
     * @return bool
     */
     public function supports (Request $request){
        return $request->request->has('_username') && $request->request->has('_password');
    }
}

Моя пользовательская сущность реализует UserInterface.

Хотя на домашней странице это указывает мне, что я аутентифицирован как «анон», если я попытаюсь снова войти в систему через отладку, я заметил, что он обнаруживает, что я аутентифицирован, и перенаправляет на контроллер домашней страницы, но в этом контроллере он говорит, что Я как анон и обратно перенаправляю на заставку.

Создается впечатление, что где-то между проверкой и перенаправлением на контроллер теряется хранилище токенов.

Любая идея?

можешь показать мне AppBundle: login: index.html.twig?

jjoselon 30.07.2018 17:02

Спасибо за ваш ответ, но я уже нашел проблему ... Моя проблема была связана с контекстом брандмауэра. Мое приложение использует несколько брандмауэров, и когда я аутентифицировался в одном брандмауэре, я не был автоматически аутентифицирован в другом. Просто добавьте контекст брандмауэра в security.yml

D. Pinheiro 30.07.2018 19:41
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Symfony Station Communiqué - 17 февраля 2023 г
Symfony Station Communiqué - 17 февраля 2023 г
Это коммюнике первоначально появилось на Symfony Station , вашем источнике передовых новостей Symfony, PHP и кибербезопасности.
Управление ответами api для исключений на Symfony с помощью KernelEvents
Управление ответами api для исключений на Symfony с помощью KernelEvents
Много раз при создании api нам нужно возвращать клиентам разные ответы в зависимости от возникшего исключения.
1
2
446
0

Другие вопросы по теме