2015-09-26 2 views
3

Есть ли кто-то, кто хорошо знает аутентификацию Symfony?Symfony2 SessionUnavailable Exception

Поскольку каждый раз, когда я пытаюсь войти в новый браузер после запуска, я получаю исключение SessionUnavailable Exception с текстом «Нет сеанса, он либо тайм-аут, либо файлы cookie не включены». Почему он не создает новый сеанс, когда я запускаю новый браузер после запуска?

Я выкопал немного глубже и нашел один вариант «require_previous_session», для которого установлено значение true: vendor/symfony/symfony/src/Symfony/Component/Security/HTTP/Firewall/AbstractAuthenticationListener.php, но я не что установить его в false, не зная, что он на самом деле делает.

Любые советы будут замечательными.

security.yml файл достаточно большой из ролевой системы, но посмотрите здесь: Security.yml

+1

Не могли бы вы опубликовать свой security.yml файл, чтобы увидеть, как вы настроили его? – angelwally

ответ

5

Установка require_previous_session немного косой, но может (надеюсь) можно объяснить с небольшим количеством кода.

Так ordinarilly, когда вы создали стандартную форму входа (как the docs), в вашем security.yml файле настройки брандмауэра с рисунком (например /user), а также установить опцию anonymous. Теперь вниз под вашим контролем доступа вы установите на страницу входа (скажем /user/login), чтобы иметь роль IS_AUTHENTICATED_ANONYMOUSLY, например, так:

firewalls: 
    default: 
     pattern: ^/user 
     anonymous: ~ 
     form_login: 
      login_path: /user/login 
      check_path: /user/login_check 

access_control: 
    - { path: ^/user/login, roles: IS_AUTHENTICATED_ANONYMOUSLY } 
    - { path: ^/user, roles: ROLE_USER } 

Теперь, что происходит, когда кто-то идет /user это они получают пересылаемой в /user/login; , но, когда они это сделают, у них будет сеанс, созданный для них (если они этого еще не сделали), и их назначенная роль будет anon (вы можете проверить это на панели инструментов Symfony, когда она находится на /user/login), как разрешено в разделе access_control выше ,

Это означает, что когда кто-то входит в систему (т. Е. Отправляет учетные данные в /user/login_check), у них уже будет создан сеанс для них, а require_previous_session будет правдой.

Для большинства людей это нормально, и вам не придется беспокоиться об этой настройке. Однако, если вы начнете касаться краев компонента безопасности, например, создав собственный поставщик проверки подлинности или отключив защиту (security: false для определенного шаблона, см. Брандмауэр по умолчанию dev), вы можете столкнуться с этим проблема.

Насколько я знаю, нет штрафа за безопасность за отсутствие сеанса перед входом в систему - у меня есть производственные площадки, где это происходит. Однако есть преимущество в том, что вы можете использовать токены CSRF (cookbook entry) в форме входа для дополнительной безопасности, а это значит, что атаки на учетные записи пользователей намного сложнее.

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

Edit, пример сверху require_previous_session значение ЛОЖЬ:

firewalls: 
    default: 
     pattern: ^/user 
     anonymous: ~ 
     form_login: 
      login_path: /user/login 
      check_path: /user/login_check 
      require_previous_session: false 
+0

Итак, require_previous_session может быть ложным без вреда? Могу ли я сделать это в некоторых конфигурационных файлах? Потому что делать это в одной из папок поставщика не будет uploded до github. –

+0

Я отредактировал свой ответ на примере. Вы также должны проверить [справочную документацию] (http://symfony.com/doc/current/reference/configuration/security.html) для компонента безопасности. –

+0

@JohnNoel благодарит вас за подробное объяснение! +1. Также было бы неплохо выяснить причину, по которой «require_previous_session» вообще в конфигурации безопасности ... это способность делать проверку CSRF единственной причиной? –

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