我正在为两种类型的用户使用两个具有相同模式的防火墙:
这是我简化的security.yml
配置:
firewalls:
admin:
pattern: .*
form_login:
login_path: /admin/login
check_path: /admin/login
logout:
path: /admin/logout
...
front:
pattern: .*
form_login:
login_path: /user/login
check_path: /user/login-check
logout: true
anonymous: true
...
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
access_control:
- { path: ^/admin/, role: ROLE_ADMIN }
- { path: ^/admin/login, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/user/login, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/user/profile, role: ROLE_FRONTEND_USER }
- { path: ^/user/upload-photo, role: ROLE_FRONTEND_USER }
...
问题在于,当任何非登录用户尝试访问时,例如/user/profile
,他们会被重定向到/admin/login
。我猜这是因为firewall
和access_control
之间没有任何关联,因此Symfony无法知道用户是否尝试访问ROLE_FRONTEND_USER
或ROLE_ADMIN
的部分,然后相应地重定向。
我的问题是,有没有优雅的方法来解决这个问题?也许使用事件监听器并手动检查被拒绝的权限,请求的URL是否需要ROLE_FRONTEND_USER
或ROLE_ADMIN
个角色?
答案 0 :(得分:0)
您可以手动设置用户重定向的网址:
EXECUTE sp_addrolemember 'db_ddladmin', [serviceaccount]
匿名用户将被重定向到预期的登录路由,而不需要每个防火墙具有特定模式。
希望这能解决你的问题。