Symfony2, FOSUserBundle: настройка проблемы только зарегистрированным пользователям разрешен доступ ко всем страницам

#php #symfony #fosuserbundle

#php #symfony #fosuserbundle

Вопрос:

Я думал, что правильно настроил настройки, когда попытался перейти на домашнюю страницу (/), и она перенаправляет меня на страницу входа (/login ). Однако, когда я нажимаю на меню навигации, такие как about (/ about) и inventory (/ inventory), страницы показывались, даже когда я не входил в систему. В настоящее время только домашняя страница перенаправляется на login, но мне нужно, чтобы все страницы перенаправлялись на login, если пользователи не вошли в систему.

Вот мой security.yml:

 security:
encoders:
    FOSUserBundleModelUserInterface: sha512

role_hierarchy:
    ROLE_ADMIN:       ROLE_USER
    ROLE_SUPER_ADMIN: ROLE_ADMIN

providers:
    fos_userbundle:
        id: fos_user.user_provider.username

firewalls:
    main:
        pattern: ^/
        form_login:
            provider: fos_userbundle
            csrf_provider: form.csrf_provider
            default_target_path: /
        logout:       true
        anonymous:    true

access_control:
    - { path: ^/$, role: ROLE_USER }
    - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/admin/, role: ROLE_ADMIN }
 

config.yml:

 fos_user:
  db_driver: orm # other valid values are 'mongodb', 'couchdb' and 'propel'
  firewall_name: main
  user_class: MainUserBundleEntityUser
 

Я что-то упускаю?

РЕДАКТИРОВАТЬ: я предполагаю, что решение состояло в том, чтобы избавиться от «$» в контроле доступа.

 access_control:
    - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/admin/, role: ROLE_ADMIN }
    - { path: ^/, roles: ROLE_USER }
 

За исключением этого, после входа в систему он перенаправит на пустую страницу с URL-адресом /_wdt/ (номер токена). Если у кого-то возникли проблемы с этим, решение состоит в том, чтобы вставить этот параметр перед «основным» в безопасности.брандмауэр yml:

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

Ответ №1:

Измените конфигурацию брандмауэра на следующую:

 access_control:
    - { path: ^/$, role: ROLE_USER }
    - { path: ^/secured, role: ROLE_USER }
    - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/admin/, role: ROLE_ADMIN }
 

И для начала измените свои маршруты для защищенных страниц /secured .

Обновить:

Вы можете запретить все маршруты после / если пользователь не вошел в систему, удалив $ в своем правиле контроля доступа:

 access_control:
    - { path: ^/, role: ROLE_USER }
 

Однако это вызовет цикл перенаправления при попытке получить доступ к маршрутам, которые должны быть доступны анонимным пользователям, например /login , или /register .

ОБНОВЛЕНИЕ 2

Как прокомментировал @user3757305 ниже, - { path: ^/, role: ROLE_USER } может быть добавлен внизу. Правила контроля доступа применяются в том порядке, в каком они указаны в конфигурации безопасности. Это означает, что все, что выше - { path: ^/, role: ROLE_USER } правила, не будет подпадать под его действие. Итак, следующая конфигурация должна работать по мере необходимости:

 access_control:
    - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/admin/, role: ROLE_ADMIN }
    - { path: ^/, role: ROLE_USER }
 

Комментарии:

1. нет способа просто запретить все маршруты после / если пользователь не вошел в систему?

2. Я думаю, что если вы поставите - { path: ^/, role: ROLE_USER } в самом низу, это избавит вас от анонимных путей доступа. У меня это работает.

3. Вероятно, это правильно, потому что правила контроля доступа обрабатываются в том порядке, в котором они отображаются в конфигурации безопасности. Я обновлю свой ответ.