我使用symfony2和FOSUserBundle。我有一个防火墙用于登录,一个用于资产和一个主要的捕获一切。但我还是得到了"没有保安"。当一个路由没有被任何防火墙覆盖,而你试图用"is_granting"访问它时抛出异常(在这里看到并解决)。路由是mydomain/de_DE/area,其中de_DE部分显然是我的{_locale}。下面是我的FOSUserBundle配置,来自config.yml。
firewalls:
login_firewall:
pattern: ^/(de_DE|de_CH)/(login|resetting)$
anonymous: true
form_login:
provider: fos_userbundle
login_path: fos_user_security_login
check_path: fos_user_security_check
csrf_provider: form.csrf_provider
logout:
path: fos_user_security_logout
assets_localeless:
pattern: ^/(compiled|web|js|css|_wdt|_profiler)/$
anonymous: true
main:
pattern: ^/$
anonymous: false
form_login:
provider: fos_userbundle
login_path: fos_user_security_login
check_path: fos_user_security_check
csrf_provider: form.csrf_provider
logout:
path: fos_user_security_logout
access_control:
- { path: ^/(compiled|web|js|css|_wdt|_profiler)$, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/(de_DE|de_CH)/(login|resetting)$, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/(de_DE|de_CH)/(my-admin|admin), role: ROLE_ADMIN }
- { path: ^/(de_DE|de_CH)/$, role: ROLE_USER }
role_hierarchy:
ROLE_ADMIN: ROLE_USER
ROLE_SUPER_ADMIN: ROLE_ADMIN
编辑/解决方案:我的问题是正则表达式。我对这个教程有一个误解。所以模式是普通的RegEx,这就是为什么我的防火墙都不起作用(见答案)。新的设置如下:
firewalls:
main:
pattern: .
anonymous: true
form_login:
provider: fos_userbundle
login_path: fos_user_security_login
check_path: fos_user_security_check
csrf_provider: form.csrf_provider
logout:
path: fos_user_security_logout
access_control:
- { path: '^/(compiled|web|js|css|_wdt|_profiler)([wd/_-]{0,})', role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: '^/([w]{0,})/(login|resetting|sale|imprint|contact)([wd/_-]{0,})', role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: '^/([w]{0,})/(my-admin|admin)([wd/_-]{0,})', role: ROLE_ADMIN }
- { path: '^/([w]{0,})/([wd/_-]{0,})', role: IS_AUTHENTICATED_FULLY }
mydomain/de_DE/area没有防火墙配置…这就是你没有保安的原因。
$表示在正则表达式中结束。这就是为什么. .
- { path: ^/(de_DE|de_CH)/$, role: ROLE_USER }
…
yourdomain/de_DE/
yourdomain/de_CH/
…