Невозможно защитить маршрут от анонимного доступа в Symfony2

Я не могу понять, почему анонимный пользователь может получить доступ к маршрутам, которые я хочу защитить, "^/nodes$" и "^/destinations$".

Где я не прав? Я внимательно прочитал этот ресурс http://symfony.com/doc/current/book/security.html, но в любом случае эти URL могут быть просмотрены анонимно!

Это мой файл security.yml:

security:
    encoders:
    Symfony\Component\Security\Core\User\User: plaintext

role_hierarchy:
    ROLE_ADMIN:       ROLE_USER
    ROLE_SUPER_ADMIN: [ROLE_USER, ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH]

providers:
    in_memory:
        memory:
            users:
                user:  { password: athena_user_2014, roles: [ 'ROLE_USER' ] }
                admin: { password: athenaspa2014, roles: [ 'ROLE_ADMIN' ] }

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

    secured_area:
        pattern:    ^/backend
        form_login:
            check_path: /backend/login_check
            login_path: /backend/login
            csrf_provider: form.csrf_provider
        logout:
            path:   /backend/logout
            target: /
        #http_basic:
        #    realm: "Secured Demo Area"

access_control:
    - { path: ^/nodes, roles: ROLE_ADMIN }
    - { path: ^/destinations, roles: ROLE_ADMIN }

person EmaOnTheBlock    schedule 10.06.2014    source источник
comment
возможно добавление безопасности: правда   -  person Derick F    schedule 11.06.2014
comment
Попробуйте добавить anonymous: ~ в свой secured_area   -  person Jovan Perovic    schedule 11.06.2014
comment
добавление анонимного: ~ похоже, не работает. Я добавил его сразу после secure_area   -  person EmaOnTheBlock    schedule 11.06.2014


Ответы (1)


Ваши пути не являются частью ни одного из ваших шаблонов брандмауэра. Вы можете внести следующие изменения, чтобы он работал:

firewalls:
    secured_area:
        pattern:   ^/
        ...
access_control:
    - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/backend, role: ROLE_ADMIN }
    - { path: ^/node, role: ROLE_ADMIN }
    ...
    - { path: ^/, role: IS_AUTHENTICATED_ANONYMOUSLY }

Последний путь в значительной степени похож на то, что делает anonymous: true. Когда никакие другие элементы управления доступом не совпадают, пользователю не требуется входить в систему. Если вы хотите ввести более строгие ограничения, вы можете сделать это, как первый путь ^/login$, который указывает, какие маршруты требуют аутентификации. Имейте в виду, что используется первый соответствующий маршрут, поэтому будьте осторожны с их порядком.

В качестве альтернативы вы можете добавить еще один брандмауэр. Но имейте в виду, что каждый брандмауэр предоставляет отдельный логин.

Вы также можете протестировать свои маршруты из консоли, используя php app/console router-команды. Если вы не знаете, как их использовать, просто введите, например, php app/console help router:match

person dbrumann    schedule 11.06.2014
comment
+1, но для меня безопаснее изменить - { path: ^/, role: IS_AUTHENTICATED_ANONYMOUSLY } на - { path: ^/.*, role: ROLE_USER } - person DonCallisto; 11.06.2014
comment
Эта работа как шарм для меня: access_control: - { path: ^/backend/login, roles: IS_AUTHENTICATED_ANONYMOUSLY } - { path: ^/destinations, roles: ROLE_ADMIN } - { path: ^/nodes, roles: ROLE_ADMIN } - { path: ^/.*, role: IS_AUTHENTICATED_ANONYMOUSLY } Всем спасибо, помогли разобраться в своих недостатках - person EmaOnTheBlock; 11.06.2014