#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. Вероятно, это правильно, потому что правила контроля доступа обрабатываются в том порядке, в котором они отображаются в конфигурации безопасности. Я обновлю свой ответ.