2017-02-19 27 views
3

Я использую symfony 3.2.3, и я хочу ограничить доступ на тех же страницах. Хорошо, не проблема! Конфигурируя security.yml, все можно сделать, и на самом деле это работает в среде dev. Но, когда я переключаю свой сайт symfony в режиме производства, ничего не работает!Symfony security prod не работает

Переключение подталкивать команды:

  • PHP кэш бен \ консоли: четкое --env = прод --no-отлаживать

У меня есть 4 страницы:

  • /(можно получить доступ ко всем)
  • /lucky (доступно для всех)
  • /auth_a Субъективная (доступ только зарегистрированным пользователям)
  • /бэкенд (доступ только пользователи ROLE_ADMIN)

Вот мой security.yml

безопасности:

encoders: 
    FOS\UserBundle\Model\UserInterface: bcrypt 

role_hierarchy: 
    ROLE_USER_LOGGED: IS_AUTHENTICATED_FULLY 
    ROLE_ADMIN:  ROLE_USER_LOGGED 

providers: 
    fos_userbundle: 
     id: fos_user.user_provider.username 

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

    default: 
     anonymous: ~ 
     http_basic: ~ 
     form_login: 
      provider: fos_userbundle 
      csrf_token_generator: security.csrf.token_manager 
     logout: 
      path: /logout 
      target:/

access_control: 
    - { path: ^/, roles: IS_AUTHENTICATED_ANONYMOUSLY } 
    - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY } 
    - { path: ^/backend, roles: ROLE_ADMIN } 
    - { path: ^/auth_area, roles: IS_AUTHENTICATED_FULLY } 

Наконец, все отлично работает dev, ничего не работает в prod: анонимный пользователь может получить доступ везде! ; (

Заранее спасибо

+2

Глядя на ваш контроль доступа эти линии бесполезны, если у вас есть только 2 определенные области с ограниченным доступом: '- {путь:^/, роли: IS_AUTHENTICATED_ANONYMOUSLY}' и - '{путь: ^/login $, роль: IS_AUTHENTICATED_ANONYMOUSLY}'. Комментируйте эти 2 директивы, удалите кеш и попробуйте. PS: Я думаю, что первая директива всегда соответствует и вызывает вашу проблему. –

ответ

2

Как пишет gp_sflover in a comment:

PS: Я думаю, что первая директива всегда соответствует и вызвать вашу проблему

и в documentation. :

Для каждого входящего запроса проверка Symfony s каждый элемент access_control, чтобы найти тот, который соответствует текущему запросу. Как только он найдет подходящую запись access_control, она останавливается - только для того, чтобы обеспечить доступ, используется только , соответствующий access_control.

Таким образом, вы должны изменить порядок правил и положить правила, которые соответствуют каждому запросу (path: ^/) в конце:

access_control: 
    - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY } 
    - { path: ^/backend, roles: ROLE_ADMIN } 
    - { path: ^/auth_area, roles: IS_AUTHENTICATED_FULLY } 
    - { path: ^/, roles: IS_AUTHENTICATED_ANONYMOUSLY } 
+0

Требуется ли '^/login $'? Похоже, что это было описано под '^ /', а два других не применяются. –

+1

@ JaredFarrish в случае, описанном в вашем вопросе, вам нужны только директивы, запрещающие доступ, поскольку пользователям уже разрешен доступ к любой странице вашего сайта как «IS_AUTHENTICATED_ANONYMOUSLY» (это происходит из-за того, что каждый брандмауэр включен «security: true» по умолчанию). –

+0

К остроумию: Я не ОП. –