FOS: Несанкционированный пользователь получает доступ к определенному URL-адресу
Мой ROLE_ADMIN
пользователь может получить доступ к URL-адресу backend/user
, хотя я не давал ему на это разрешения. Это первый раз, когда я использую FOS, поэтому, возможно, я совершаю глупую ошибку ниже. Я прочитал документацию. Что я должен сделать, чтобы избежать этой проблемы с доступом?
Заранее благодарю
Безопасность.yml
role_hierarchy:
ROLE_ADMIN: ROLE_USER
ROLE_SUPER_ADMIN: [ROLE_USER, ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH]
access_control:
- { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/backend, role: ROLE_ADMIN }
- { path: ^/backend/user, role: ROLE_SUPER_ADMIN }
ПОЛЬЗОВАТЕЛИ
mbp:symfony$ php app/console fos:user:create user user@foobar user
Created user user
mbp:symfony$ php app/console fos:user:promote user ROLE_USER
User "user" did already have "ROLE_USER" role.
mbp:symfony$ php app/console fos:user:create admin admin@foobar admin
Created user admin
mbp:symfony$ php app/console fos:user:promote admin ROLE_ADMIN
Role "ROLE_ADMIN" has been added to user "admin".
mbp:symfony$ php app/console fos:user:create superadmin superadmin@foobar superadmin
Created user superadmin
mbp:symfony$ php app/console fos:user:promote superadmin ROLE_SUPER_ADMIN
Role "ROLE_SUPER_ADMIN" has been added to user "superadmin".
2 answers
Управление доступом использует первое правило соответствия для обеспечения доступа, поэтому ваши правила останавливаются на - { path: ^/backend, role: ROLE_ADMIN }
, что означает, что правило после никогда не будет достигнуто.
Чтобы это работало так, как вы ожидали, вам следует изменить порядок ваших правил, чтобы они соответствовали..
access_control:
- { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/backend/user, role: ROLE_SUPER_ADMIN }
- { path: ^/backend, role: ROLE_ADMIN }
В вашем коде шаблон регулярного выражения соответствует ROLE_ADMIN перед ROLE_SUPER_ADMIN. Попробуйте на этом пути :- { path: ^/backend/user, roles: ROLE_SUPER_ADMIN }
- { path: ^/backend, roles: ROLE_ADMIN }