Не могу выйти из системы с Symfony 4

Я не могу выйти из системы пользователя.

Я перенес пользовательскую логику управления пользователями в проект Symfony 4. Он использует рецепты для security и guard.

Вот конфигурация logout в моем основном брандмауэре:

    logout:
        path: /logout
        target: /

Результат: - Пользователь переходит в /logout - Пользователь перенаправляется в / - is_granted("IS_AUTHENTICATED_REMEMBERED") продолжает возвращать true в моем шаблоне (ожидается false)

Другие соображения: - Запись брандмауэра срабатывает, потому что я получаю ошибки, если удаляю ее - Я пытался добавить дополнительные параметры в logout, чтобы уничтожить сеанс и файлы cookie, однако это не имело значения - Вход в систему работает нормально

Любая идея о том, как устранить эту проблему?

:: edit - добавлено security.yaml по запросу ::

security:
    encoders:
        App\Entity\User: bcrypt
    role_hierarchy:
        ROLE_ADMIN:       ROLE_USER
        ROLE_SUPER_ADMIN: ROLE_ADMIN
    providers:
        app_users:
            entity: { class: App\Entity\User, property: email }
        app_oauth:
            id: app.oauth_user_provider
    firewalls:
        dev:
            pattern: ^/(_(profiler|wdt)|css|images|js)/
            security: false
        main:
            provider: app_users
            anonymous: ~
            oauth:
                resource_owners:
                    google: "/login/check-google"
                default_target_path: /
                login_path: /
                failure_path: /login
                oauth_user_provider:
                    service: app.oauth_user_provider
            remember_me:
                secret: "%env(APP_SECRET)%"
                lifetime: 2592000
                path:  /
            guard:
                authenticators:
                    - App\Security\LoginFormAuthenticator
                entry_point: App\Security\LoginFormAuthenticator
            logout:
                path: /logout
                target: /
            switch_user: ~

person Coder1    schedule 20.12.2017    source источник
comment
Здравствуйте, не могли бы вы показать нам свой config/packages/security.yaml файл?   -  person MatMouth    schedule 21.12.2017
comment
@MatMouth Да, я только что добавил, спасибо за внимание.   -  person Coder1    schedule 21.12.2017
comment
У вас нет контроля доступа для авторизации страницы для анонимного пользователя access_control: - { path: ^/login/check-google, roles: IS_AUTHENTICATED_ANONYMOUSLY }   -  person MatMouth    schedule 21.12.2017
comment
Каким было окончательное решение?   -  person db306    schedule 17.05.2018


Ответы (3)


Проверьте методы serialize и unserialize для поля $this->email в App\Entity\User.

person user9451958    schedule 06.03.2018

Добавьте эти команды

В файле security.yaml

logout:
                path:   /logout
                target: /
                invalidate_session: true

В контроллере

    /**
     * @Route("/logout", name="logout")
     */
    public function logout()
    {

    }

Кнопка выхода

<a class="text-muted" href="{{ path('logout') }}">logout </a>
person viveka    schedule 14.05.2018
comment
Это верно по умолчанию: https://symfony.com/doc/current/reference/configuration/security.html#firewalls - person vaso123; 03.10.2019

См. мой ответ на ту же проблему здесь

Я повторю то, что сработало для меня:

Если вы следуете инструкциям на странице Выход из Symfony Security, убедитесь, что вы используйте правильное имя маршрута, чтобы добраться до /logout. Мне пришлось использовать «app_logout», чтобы фактически вывести его из системы, и я не смог изменить это имя пути в файле Security.yaml без изменения аннотаций контроллера (см. ниже). Контроллер не нужен. Пользовательский обработчик не требуется (слава богу).

После того, как вы настроите выход из системы, попробуйте запустить php bin/console debug:router, чтобы проверить фактический путь к /logout.

Часть выхода из моего Security.yaml выглядела так:

logout:
    path: app_logout
    # where to redirect after logout
    target: front

Основываясь на инструкциях, я добавил пустой контроллер (если вам нужны собственные имена путей, вам придется изменить имена путей здесь, а также добавить изменение в Security.yaml):

<?php

//App/Controller/SecurityController.php

namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;

class SecurityController extends AbstractController
{
    /**
     * @Route("/logout", name="app_logout")
     */
    public function logout()
    {
        throw new \Exception('This method can be blank - it will be intercepted by the logout key on your firewall');
    }
}

Мой звонок выглядел так:

<a class="nav-link" href="{{ path('app_logout') }}">Logout</a>
person tlarson    schedule 05.11.2019