access_control 无效

access_control doesn't work

我想用 access_control 保护路由 /admin 但不起作用,我总是可以不登录就进入。

编辑

这是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 }

改变

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",控制将失败,任何人都可以登录。

我的解决方案的第一个版本,将匹配 admin 之前的任何前缀。对于第二个,只有在 a 和 z 之间恰好有两个字母(小写)的前缀才会匹配(因此,每个语言环境)