我想使用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 }
答案 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之间只有两个字母的前缀(小写)将匹配(因此,每个语言环境)