Symfony PHP Logout не работает

У меня есть функция выхода из системы, которая работала в другом проекте, но по какой-то причине не работает в проекте, над которым я сейчас работаю. Похоже, он просто обновляет страницу. Я проверил официальную документацию Symfony https://symfony.com/doc/current/security.html, но безрезультатно. Надеюсь, вы, ребята, можете мне помочь.

Обновлено: Security.yml:

# To get started with security, check out the documentation:
# https://symfony.com/doc/current/security.html
security:
    providers:
        in_memory:
            memory:
                users:
                    beheerder:
                        password: admin
                        roles: 'ROLE_BEHEERDER'

    access_control:
        - { path: '^/beheerder/*', roles: [ROLE_BEHEERDER] }

    encoders:
        Symfony\Component\Security\Core\User\User: plaintext


    firewalls:
        # disables authentication for assets and the profiler, adapt it according to your needs
        dev:
            pattern: ^/(_(profiler|wdt)|css|images|js)/
            security: false

        main:
            anonymous: 
            # activate different ways to authenticate

            # https://symfony.com/doc/current/security.html#a-configuring-how-your-users-will-authenticate
            http_basic: ~

            # https://symfony.com/doc/current/security/form_login_setup.html
            #form_login: ~
            logout:
                path: security_logout
                target: /

Контроллер:

<?php

namespace AppBundle\Controller;

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\ExpressionLanguage\Expression;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface;


class DefaultController extends Controller
{

    //Functie om naar de homepagina te gaan met een redirect naar de homepagina van de gebruiker.

    /**
     * @Route("/", name = "homepage")
     */
    public function indexAction(Request $request, AuthorizationCheckerInterface $authorizationChecker)
    {
        if ($authorizationChecker->isGranted(new Expression('"ROLE_BEHEERDER" in roles')))
        {
            return $this->redirectToRoute('beheerder');
        }
        else
        {
            return $this->render('default/index.html.twig');
        }
    }

    /**
     * @Route("/beheerder", name = "beheerder")
     */
    public function beheerder(Request $request)
    {
        return new Response($this->renderView('beheerder/index.html.twig'));
    }

    /**
     * @Route("/logout", name = "security_logout")
     */
    public function logoutAction(Request $request)
    {
        return new Response($this->renderView('logout.html.twig'), 401);
    }


}

Выйти из Twig:

<!DOCTYPE html>
<html>
    <head>
        <meta charset = "UTF-8" />
        <title>{% block title %}Overzicht{% endblock %}</title>
        <link rel = "icon" type = "image/x-icon" href = "{{ asset('favicon.ico') }}" />
    </head>
    <body>
        <p>Redirecting back....</p>
        <script>
            document.cookie = 'PHPSESSID=; Path=/; expires=Thu, 01 Jan 1970 00:00:01 GMT;';
            window.location.href = '{{ url('homepage') }}';
        </script>
    </body>
</html>

Обновлено: я использую Symfony 3.4. Когда я перехожу на страницу / выход из системы, похоже, что страница просто обновляется. Я вижу, что он переходит в функцию выхода, но пользователь не выходит из системы.

Поподробнее, пожалуйста, версию Symfony и что произошло при выходе из системы.

user6830821 26.07.2018 10:31

@MohammadTrabelsi Отредактировал вопрос.

Mr J. 26.07.2018 10:38
logout: определяется дважды. Вероятно, вам следует удалить logout: true.
A.L 26.07.2018 11:09

@ A.L Сделано, но все равно не работает.

Mr J. 26.07.2018 11:16

Я знаю, что это немного поздно для игры, но я бы не рекомендовал писать параметры и значения на вашем родном языке (голландском).

Nik 30.03.2021 10:19
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
5
3 406
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

контроль доступа в вы определяете путь выхода из системы для IS_AUTHENTICATED_ANONYMOUSLY, это неправильно.

Удалите - { path: '^/logout', roles: [IS_AUTHENTICATED_ANONYMOUSLY] }

ИЛИ ЖЕ

редактировать - { path: '^/logout', roles: [ROLE_BEHEERDER] }

Спасибо за отзыв, изменил.

Mr J. 26.07.2018 11:18

- {путь: '^ / logout', роли: [ROLE_BEHEERDER]} добавьте эту строку в управление доступом, а затем отметьте

Ravi Damasiya 26.07.2018 11:58

Я попробовал, но ничего не вышло. Но это не должно быть проблемой, потому что без него каждый может выйти из системы.

Mr J. 26.07.2018 12:03

Если вы не возражаете, настройте лучшую функциональность входа в пакет fos-user.

Ravi Damasiya 26.07.2018 12:05

Пока это только больше, но я расширю его в будущем.

Mr J. 26.07.2018 12:06

Вы используете фос ...?

Ravi Damasiya 26.07.2018 12:14

Вы не установили брандмауэры

main:
        anonymous: ~

это должно выглядеть как основной: анонимный: ~ secured_arena: шаблон: ^ / beheerder

имея это говорит, что каждый может получить доступ к "основному" брандмауэру, вы должны ограничить область

когда он у вас есть, просто добавьте в брандмауэр следующие строки

 logout:
            path:   /logout
            target: /

и определите маршрут / выход из системы, который вы уже сделали. Symfony автоматически выйдет из системы.

Также необходимо указать аутентификатор и проверку контрольного пути https://symfony.com/doc/current/security/custom_password_authenticator.html

app/config/security.yml

security:
    # editor fold [...]
    firewalls:
        # editor fold [...]
        main:
            # editor fold [...]
            # add logout into the security firewall
            logout:
                path: security_logout
                target: /
    # editor fold [...]
    access_control:
        - { path: '^/beheerder/*', roles: [ROLE_BEHEERDER] }
        # Not needed
        # - { path: '^/logout', roles: [IS_AUTHENTICATED_ANONYMOUSLY] }

app/config/routing.yml

# editor fold [...]
# add logout path into main routing file
security_logout:
    path: /logout

Twig view

<!-- logout link -->
<a href = "{{ path('security_logout') }}">Logout</a>

Спасибо за ответ, но это не сработало. Отредактировал вопрос, может что то не то реализовал?

Mr J. 26.07.2018 11:07

@ Мистер Дж. Вы удалили / вышли из системы на своем контроллере? Вам это не нужно ... Маршрут выхода находится в файле app / config / routing.yml, больше нечего добавить ... Symfony справится с этим самостоятельно

Preciel 26.07.2018 16:08
Ответ принят как подходящий

Из документации по безопасности Symfony: https://symfony.com/doc/3.4/security.html#logging-out

Notice that when using http-basic authenticated firewalls, there is no real way to log out : the only way to log out is to have the browser stop sending your name and password on every request. Clearing your browser cache or restarting your browser usually helps. Some web developer tools might be helpful here too.

Вы используете http-basic, поэтому очистить cookie не получится. Поэтому, если вы хотите использовать этот код, вам нужно реализовать другую аутентификацию и прекратить использование http-basic.

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