Symfony access_control配置角色访问首页及子页面权限异常问题
问题原因
当前配置不生效是access_control的路径正则写法不符合预期导致的:
- 第一条规则
path: ^/未添加行尾匹配符$,正则语义为「匹配所有以/开头的路径」,站点内所有路由(包括/example这类子页面)都会优先命中这条规则,直接通过ROLE_USER权限校验,后续的管理员权限规则永远不会触发。 - 第二条规则
path: ^/*的正则写法存在冗余,*修饰符作用于前侧的/,语义为「匹配以0个或多个/开头的路径」,和第一条规则的匹配范围几乎完全重叠,本身就没有生效机会。
正确配置
调整security.yaml的访问控制规则顺序和正则写法即可,不需要为每个子页面单独配置规则:
security: access_control: - ... # 保留原有优先级更高的规则,比如登录页、公开静态资源、公共接口的访问规则放在最前 # 精准匹配根路径首页,仅要求ROLE_USER权限 - { path: ^/$, roles: ROLE_USER } # 匹配其余所有站点路径,要求ROLE_ADMIN权限 - { path: ^/, roles: ROLE_ADMIN }
配置逻辑说明
- 正则
^/$通过行尾符$做了严格限定,只会匹配路径完全等于/的首页路由,不会命中/example、/user/profile这类带子级路径的页面,持有ROLE_USER的普通用户可以正常访问首页。 - 首页规则之后的
path: ^/规则会匹配所有未被前置规则命中的站点路径,所有子页面默认要求ROLE_ADMIN权限才能访问,后续新增的子路由会自动套用该规则,不会因为漏配产生安全漏洞。
注意:如果站点存在无需登录即可访问的公共页面(比如登录页
/login、密码重置页/reset-password),请将对应公共路径的访问控制规则放在上述两条规则之前,避免被权限规则拦截。
内容的提问来源于stack exchange,提问作者Omar Trkzi
相关产品推荐
相关产品推荐

