Роль Symfony и безопасность объяснены

Я пытаюсь изучить роли и безопасность Symfony. Мой текущий файл security.yml выглядит так:

role_hierarchy: 
    ROLE_USER: ROLE_DO_ALMOST_NOTHING
    ROLE_EDITOR: [ ROLE_USER, ROLE_ALLOWED_TO_EDIT ]
    ROLE_CONTRIBUTOR: [ ROLE_EDITOR, ROLE_ALLOWED_TO_CONTRIBUTE ]
    ROLE_ADMIN: [ ROLE_CONTRIBUTOR ]
    ROLE_SUPER_ADMIN: [ ROLE_ADMIN, ROLE_ALLOWED_TO_DO_ANY_THING ]

access_control: 
    - { path: ^/admin, roles: ROLE_USER }
    - { path: ^/admin/editor, roles: ROLE_ADMIN }
    - { path: ^/editor, roles: ROLE_EDITOR }
    - { path: ^/contributor, roles: ROLE_CONTRIBUTOR }
    - { path: ^/super, roles: ROLE_SUPER_ADMIN }

И я использую эту настройку для своих пользователей:

providers:
    in_memory:
        memory: 
            users:
                person:
                    password: password!
                    roles: 'ROLE_USER'
                admin: 
                    password: password2
                    roles: 'ROLE_ADMIN'

Вот моя проблема. Мне не хватало части безопасности access_control, однако путь ^/admin/editor с ролями, отмеченными как ROLE_ADMIN, позволит пользователю получить доступ к маршруту, даже если у этого пользователя не было роль ROLE_ADMIN. Мне было интересно, связано ли это с тем, что сам маршрут используется тем же контроллером, что и маршрут ^admin? Или заставил кого-то увидеть, где я мог ошибиться с кодом, поскольку пользователь может получить доступ к маршруту, а я им не должен.

Остальные маршруты:

- { path: ^/editor, roles: ROLE_EDITOR }
- { path: ^/contributor, roles: ROLE_CONTRIBUTOR }
- { path: ^/super, roles: ROLE_SUPER_ADMIN }

Работайте как положено.


person Kaley36    schedule 11.08.2017    source источник
comment
Здравствуйте, мой ответ устранил вашу проблему?   -  person Jason Roman    schedule 13.08.2017


Ответы (1)


Проблема в том, что вы соответствуете /admin перед совпадением admin/editor, а для этого требуется только роль ROLE_USER. Когда у тебя есть:

- { path: ^/admin, roles: ROLE_USER }

Это соответствует всему, что начинается с /admin, включая admin/editor. Как только Symfony найдет подходящий маршрут, он не будет проверять первый из них. Так что ваш ^/admin/editor/ чек никогда не будет достигнут. Попробуйте вместо этого:

access_control: 
    - { path: ^/admin/editor, roles: ROLE_ADMIN }
    - { path: ^/admin, roles: ROLE_USER }
    - { path: ^/editor, roles: ROLE_EDITOR }
    - { path: ^/contributor, roles: ROLE_CONTRIBUTOR }
    - { path: ^/super, roles: ROLE_SUPER_ADMIN }

Как правило, ваши наиболее детализированные / конкретные маршруты следует ставить на первое место. Любые подмаршруты всегда должны располагаться впереди основного маршрута.

person Jason Roman    schedule 11.08.2017
comment
Да, это так. Спасибо - person Kaley36; 13.08.2017