access_control不起作用

时间:2015-08-03 19:22:13

标签: security symfony access-control

我想使用access_control来保护路径 / admin ,但不能正常工作,我总是可以在不登录的情况下进入。

修改

这是管理员的路线:

admin_homepage:
    resource: "@AppBundle/Resources/config/admin/index.yml"
    prefix:   /{_locale}/admin

如果我从access_control路由中删除 {_ locale} ,我该如何解决? 这是Security.yml

role_hierarchy:
    ROLE_ADMIN:       [ROLE_AUTEUR, ROLE_MODERATEUR]
    ROLE_SUPER_ADMIN: [ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH]

providers:
    main:
        id: fos_user.user_provider.username_email


firewalls:
    main:
        pattern:   ^/
        anonymous: true
        provider:  main
        form_login:
            login_path: fos_user_security_login
            check_path: fos_user_security_check
            default_target_path: frontend_index
            csrf_provider: form.csrf_provider
        logout:
            path:   fos_user_security_logout
            target: frontend_index
        remember_me:
            key:    %secret%

access_control:
    - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/admin, roles: ROLE_ADMIN }

1 个答案:

答案 0 :(得分:3)

更改

access_control:
    [...]
    - { path: ^/admin, roles: ROLE_ADMIN }

access_control:
    [...]
    - { path: ^/.*/admin, roles: ROLE_ADMIN }

(如果你愿意,你也可以使用它)

access_contol:
    [...]
    - { path: ^/[a-z]{2}/admin, roles: ROLE_ADMIN }

原因是安全控制是使用正则表达式执行的,因此如果您在“admin”之前未指定任何前缀,则控件将失败,任何人都可以登录。

我的解决方案的第一个版本,管理员之前的任何前缀都将匹配。使用秒,只有a和z之间只有两个字母的前缀(小写)将匹配(因此,每个语言环境)