Не работает logout в Symfony 6.3

verfaa

Профессор
Регистрация
29 Янв 2007
Сообщения
416
Реакции
49
Есть сайт на symfony 6.3. Когда разрабатывал его локально на localhost в docker проблемы вроде небыло. Но вот как только перенёс на купленный домен на сервер появилась проблема. Тут нужно сказать, что доменная зона моего домена .in.net, т.е. домен имеет вид:

Код:
domain.in.net
На сайте имеется вход только через соц. сети. И вот сам вход на сайт работает отлично - я получаю от соц. сети данные, пишу в базу и логиню юзера. А вот выход не получается никак - мучаюсь уже второй день. Вот мои конфиги: security.yaml

Код:
security:

    # https://symfony.com/doc/current/security.html#registering-the-user-hashing-passwords

    password_hashers:

        Symfony\Component\Security\Core\User\PasswordAuthenticatedUserInterface: 'auto'

    # https://symfony.com/doc/current/security.html#loading-the-user-the-user-provider

    providers:

        fetcher:

            id: App\Security\UserProvider

    firewalls:

        dev:

            pattern: ^/(_(profiler|wdt)|css|images|js)/

            security: false

        main:

            lazy: true

            provider: fetcher

            user_checker: App\Security\UserChecker

            custom_authenticator:

                - App\Security\OAuth\GithubAuthenticator

                - App\Security\OAuth\FacebookAuthenticator

                - App\Security\OAuth\GoogleAuthenticator

                - App\Security\OAuth\InstagramAuthenticator

                - App\Security\OAuth\LinkedinAuthenticator

                - App\Security\OAuth\MicrosoftAuthenticator

                - App\Security\OAuth\YahooAuthenticator

            # entry_point: App\Security\OAuth\GithubAuthenticator



            logout:

                path: app_logout

                target: team





            # activate different ways to authenticate

            # https://symfony.com/doc/current/security.html#the-firewall



            # https://symfony.com/doc/current/security/impersonating_user.html

            # switch_user: true



    role_hierarchy:

        ROLE_ADMIN:

            - ROLE_USER



    # Easy way to control access for large sections of your site

    # Note: Only the *first* access control that matches will be used

    access_control:

        - { path: ^/dashboard/adminka, roles: ROLE_ADMIN }

        - { path: ^/dashboard, roles: ROLE_USER }



when@test:

    security:

        password_hashers:

            Symfony\Component\Security\Core\User\PasswordAuthenticatedUserInterface:

                algorithm: auto

                cost: 4 # Lowest possible value for bcrypt

                time_cost: 3 # Lowest possible value for argon

                memory_cost: 10 # Lowest possible value for argon

Здесь нужно отметить, что при переходе на роут app_logout (указанный в path:) происходит редирект на роут team (указанный в target:), но разлогина не происходит. Юзер так и остаётся залогиненным. Но вот путь /logout symfony перехватывает как и должно быть.

Ещё во framework.yaml пробовал добавлять: cookie_domain: domain.in.net но проблему это не решило

Код:
framework:

    secret: '%env(APP_SECRET)%'

    #csrf_protection: true

    http_method_override: false

    handle_all_throwables: true



    # Enables session support. Note that the session will ONLY be started if you read or write from it.

    # Remove or comment this section to explicitly disable session support.

    session:

        handler_id: null

        cookie_secure: auto

        cookie_samesite: lax

        cookie_domain: domain.in.net # Here specify my domain name

        storage_factory_id: session.storage.factory.native



    #esi: true

    #fragments: true

    php_errors:

        log: true



when@test:

    framework:

        test: true

        session:

            storage_factory_id: session.storage.factory.mock_file

Ещё заметил, что если очистить кэш браузера, то можно зайти и затем выйти из аккаунта корректно. Но вот если после этого зайти повторно выйти уже не получается.
При переходе на /logout сессия так и остаётся висеть в cookie, хотя перенаправляет на роут указанный в target: team
Это что баг в symfony? Перерыл весь интернет, такой проблемы больше не встречал.
 
Последнее редактирование:
Проблема, возможно, связана с кукисами и доменными настройками. Вот несколько вещей, которые стоит проверить:

  1. Настройка домена кукисов: Убедитесь, что вы правильно настроили параметр cookie_domain в конфигурации Symfony. В вашем случае он должен быть установлен как .domain.in.net (включая точку перед доменом), чтобы куки были доступны для всех поддоменов.
    YAML:
    framework:
      session:
        cookie_domain: .domain.in.net

  2. Контроль кеша браузера: Проблема, которую вы описали, когда очистка кэша браузера решает проблему, может быть связана с кешированием кукисов. Удостоверьтесь, что ваш браузер не кеширует куки. Вы можете попробовать выполнять запросы в режиме инкогнито или в другом браузере, чтобы проверить это. Вообще на этом месте я бы сконцентрировался в первую очередь.
    В частности советую установить какое-нибудь расширение, что делает удобней отслеживание кукисов, чем developer console, например: Edit Tsis Cookie. И смотреть, что просиходит при попытке вылогиниться.

    Убедитесь, что срок действия кукиса не истек. Вы можете установить его в достаточно большое значение для теста: cookie_lifetime: 31536000 # (1 год в секундах)

  3. Очистка сессии в logout: Попробуйте явно очистить сессию в app_logout контроллере, если вы этого еще не делаете. Например:

    PHP:
    // в вашем контроллере, обрабатывающем logout
    public function logout(): Response
    {
    $this->get('security.token_storage')->setToken(null);
    $this->get('session')->invalidate();
    
    // редирект и т.д.
    }


  4. Проверка журналов Symfony: Просмотрите журналы Symfony для более подробной информации о том, что может происходить во время выхода. Обратите внимание на любые предупреждения или ошибки, связанные с сессиями и куками.

  5. Dev-режим: Если у вас все еще остаются проблемы, попробуйте временно отключить кеширование (если оно включено) и включить dev режим Symfony. Это может предоставить более подробную информацию об ошибке.
    YAML:
    # в вашем файле .env
    APP_ENV=dev

    Вообще, конечно, тяжело помочь не видя код и особенно логи. Накидал на вскидку наиболее возможных вариантов в порядке убывания вероятности.
 
Назад
Сверху