2016-07-15 2 views
2

Я пытаюсь выполнить мою функцию выхода из системы, используя Symfony 3.1, но пока не работает. Я следую за книжной документацией шаг за шагом, но все, что я получаю, не является исключением:Symfony 3.1: Не удалось найти контроллер для пути "/ logout"

Невозможно найти контроллер для пути/выхода из системы. Неправильно указан маршрут .

я активировать правильный параметр конфигурации (выхода из системы) в файле security.yml

security: 
     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 
       form_login: 
        login_path: login 
        check_path: login 
      secured_area: 
       anonymous: ~ 
       logout: 
        path: /logout 
        target:/

И я создать маршрут внутри routing.yml:

logout: 
    path: /logout 

И это все согласно документации, контроллер не нужен, но исключения говорят о неправильном пути контроллера.

Что я делаю неправильно?

ответ

3

Я думаю, это потому, что у вас установлены два брандмауэра. На данный момент, избавиться от secured_area вещи и попробовать что-то вроде:

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

    main: 
     pattern: ^/ 
     anonymous: ~ 
     switch_user: true 

     form_login: 
      provider:   user_provider 
      login_path:   user_login 
      check_path:   user_login_check 
      default_target_path: app_welcome 

      username_parameter: username 
      password_parameter: password 

      csrf_parameter:  _csrf_token 
      csrf_token_id:  authenticate 
      csrf_token_generator: security.csrf.token_manager 

     logout: 
      path: user_logout 
      target: app_welcome 

Обратите внимание, что раздел выход из системы находится под основным брандмауэром. После того, как у вас будет основной брандмауэр, вы можете попробовать снова включить protected_area, если вам это действительно нужно.

И да, я ленился и просто скопировал/вложил рабочую конфигурацию. Вам нужно будет настроить маршруты в соответствии с вашими.

+0

После нескольких изменений (я удаляю csrf stuff и поставщика) это сработало!Но почему используется защищенная область в документации? Спасибо! – Jotaeme

+0

Я могу понять путаницу. Настройка компонента безопасности может быть сложной задачей. И документация не соответствует 100%. Рассмотрите возможность участия в документации: http://symfony.com/doc/current/contributing/documentation/overview.html – Cerad

0

Поскольку у вас нет контроллера, связанного с этим маршрутом, скорее всего. Если вы используете пакет, такой как FOSUser, вам просто нужно импортировать routing.yml, предоставленный пакетом. Если у вас нет пакета/контроллера, который должен позаботиться об этом маршруте, вы должны его реализовать.

+2

Действительно, у меня нет контроллера, связанного с этим маршрутом, так как поваренная книга говорит, что (контроллер) не требуется. – Jotaeme

0

Чтобы добавить более подробную информацию в ответ Cerad: пользователь безопасности в Symfony привязан к «контексту безопасности», который по умолчанию соответствует брандмауэру. В вашем случае вы хотите выйти из контекста («брандмауэр»), на который вы ввели требование проверки подлинности form_login, и поэтому ваша конфигурация выхода должна быть установлена ​​на «главном» брандмауэре, а не на новом, называемом " secured_area».

Документация использует имя брандмауэра «secure_area» только как способ указать, что эта конфигурация предназначена для использования в брандмауэре, который защищает часть вашего веб-сайта. Это не означает, что вы копируете это имя буквально в свою конфигурацию; скорее, в вашем случае брандмауэр, который вы пытаетесь защитить, называется «основным». В этом смысле documentation немного запутан, потому что везде он использует только брандмауэр под названием «main» для своих примеров, в том числе для примеров, где он устанавливает защищенную область. Поэтому я думаю, было бы лучше, если бы он использовал «основной» в этом конкретном примере.

Кроме того, вам необходимо убедиться, что маршрут выхода (путь) фактически обработан брандмауэром, для которого вы его настроили, а не быть «пойманным» с помощью другого брандмауэра. В вашем случае это произойдет автоматически, потому что вы не наложили никаких ограничений на свой «основной» брандмауэр и, таким образом, ловите все.

Смежные вопросы