Php Symfony:多个防火墙上下文-用户被转发到错误的上下文
我有一个前端登录名(这是可选的),还有一个管理面板登录名,这是必需的 当用户转到Php Symfony:多个防火墙上下文-用户被转发到错误的上下文,php,security,symfony,authentication,Php,Security,Symfony,Authentication,我有一个前端登录名(这是可选的),还有一个管理面板登录名,这是必需的 当用户转到fe_login时,他们可以登录到frontend上下文。这没关系 当他们进入admin\u login时,他们应该能够登录到admin上下文。这是不是好的 问题是,当我转到/admin时,我会被重定向到fe\u登录,而我应该被重定向到admin\u登录 这是我的安全性。yml: 知道我做错了什么吗?这是我的security.yml,但正如我所说的,它是针对Symfony2.0的,也许你会发现一个提示 securit
fe_login
时,他们可以登录到frontend
上下文。这没关系
当他们进入admin\u login
时,他们应该能够登录到admin
上下文。这是不是好的
问题是,当我转到/admin
时,我会被重定向到fe\u登录
,而我应该被重定向到admin\u登录
这是我的安全性。yml
:
知道我做错了什么吗?这是我的
security.yml
,但正如我所说的,它是针对Symfony2.0的,也许你会发现一个提示
security:
encoders:
### ...
role_hierarchy:
ROLE_ADMIN: ROLE_USER
ROLE_SUPER_ADMIN: [ROLE_USER, ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH]
providers:
fos_userbundle:
id: fos_user.user_manager
admin_adminbundle:
id: custom_admin_manager_id
firewalls:
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
admin:
pattern: ^/admin/
form_login:
check_path: /admin/check-login
login_path: /admin/login
provider: admin_adminbundle
csrf_provider: form.csrf_provider
post_only: true
success_handler: login_success_handler
failure_handler: admin_login_failure_handler
username_parameter: login_username
password_parameter: login_password
remember_me: false
logout:
path: /admin/logout
target: /admin/login
anonymous: true
frontend:
pattern: ^/
form_login:
check_path: /frontend/check-login
login_path: /frontend/login
provider: fos_userbundle
csrf_provider: form.csrf_provider
post_only: true
success_handler: login_success_handler
failure_handler: login_failure_handler
username_parameter: login_username
password_parameter: login_password
logout:
path: /frontend/logout
success_handler: logout_success_handler
anonymous: true
access_control:
- { path: ^/frontend/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/admin/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
我不太清楚原因,但您现在必须确保
security.yml
必须是一个非常清晰的文件,以避免配置错误(这将导致安全问题)
因此,关于您的文件:
- 它错过了前端部分的模式键:我将添加
pattern:^/
- 前端登录路径可以指定为后端登录路径
- 你规则的顺序让我觉得有些不对劲
security:
encoders:
App\FrontendBundle\Controller\UserController:
algorithm: bcrypt
App\AdminBundle\Controller\UserController:
algorithm: bcrypt
App\Entity\User:
algorithm: bcrypt
providers:
administrators:
entity: { class: AppEntity:User, property: username }
firewalls:
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
login_admin:
pattern: ^/admin/login
anonymous: ~
admin:
pattern: ^/admin
form_login:
login_path: admin_login
check_path: admin_auth
csrf_provider: form.csrf_provider
logout:
path: admin_logout
target: admin_login
login_frontend:
pattern: ^/login # you should adapt this to your app
anonymous: ~
frontend:
pattern: ^/
anonymous: ~
form_login:
login_path: fe_login
check_path: fe_auth
csrf_provider: form.csrf_provider
always_use_default_target_path: true
default_target_path: fe_landing
logout:
path: fe_logout
target: fe_landing
access_control:
- { path: ^/admin/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/admin, roles: [ROLE_ADMIN,ROLE_MANAGER,ROLE_DRIVER,ROLE_PARTNER] }
你有一些看起来不必要的防火墙。让我们简化防火墙配置:
firewalls:
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
admin:
pattern: ^/admin
form_login:
login_path: admin_login
check_path: admin_auth
csrf_provider: form.csrf_provider
logout:
path: admin_logout
target: admin_login
anonymous: ~
frontend:
pattern: ^/
anonymous: ~
form_login:
login_path: fe_login
check_path: fe_auth
csrf_provider: form.csrf_provider
always_use_default_target_path: true
default_target_path: fe_landing
logout:
path: fe_logout
target: fe_landing
access_control:
# allow unauthenticated to access admin login
- { path: ^/admin/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
# restrict admin access
- { path: ^/admin, roles: [ROLE_ADMIN,ROLE_MANAGER,ROLE_DRIVER,ROLE_PARTNER] }
# allow unauthenticated to access front end login
- { path: ^/fe/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
# restrict front end access
- { path: ^/fe, roles: ROLE_USER } # or whatever the role is of your frontend user
# allow all other pages to be viewed by unauthenticated users
- { path: ^/, roles: IS_AUTHENTICATED_ANONYMOUSLY }
此配置使/fe
下的所有页面都需要前端授权,/admin
下的所有页面都需要管理员授权。而所有其他页面则完全不受保护。你可以随意调整
访问控制的顺序很重要。一旦规则匹配,它就不会尝试匹配任何其他条目。此配置应起作用,以便显示正确的登录名。但是,您似乎没有为每个防火墙使用不同的用户提供程序。因此,当您登录时,应用程序将为两个登录使用相同的提供程序。这可能不是你想要的,但我想我会指出这一点。如果您确实希望每个登录都有不同的用户提供程序,只需将
提供程序:ProviderName
添加到每个防火墙。这会导致管理员登录时出现重定向循环
您找到错误了吗?在我的一个应用程序中,我有完全相同的设置,但用于Symfony 2.0和旧版本的FOSUserBundle,所以我不确定它是否能帮助您。还没有。但让我们看看赏金是否有帮助;)修改答案。希望能有帮助++同意这一点,从一个干净的原型开始,并在每次修改后进行测试,这样您就可以发现错误。我不建议使用那么多防火墙。没有必要为每个登录页面设置防火墙。使用尽可能少的防火墙,事情就更容易管理,也更容易进行故障排除。
firewalls:
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
admin:
pattern: ^/admin
form_login:
login_path: admin_login
check_path: admin_auth
csrf_provider: form.csrf_provider
logout:
path: admin_logout
target: admin_login
anonymous: ~
frontend:
pattern: ^/
anonymous: ~
form_login:
login_path: fe_login
check_path: fe_auth
csrf_provider: form.csrf_provider
always_use_default_target_path: true
default_target_path: fe_landing
logout:
path: fe_logout
target: fe_landing
access_control:
# allow unauthenticated to access admin login
- { path: ^/admin/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
# restrict admin access
- { path: ^/admin, roles: [ROLE_ADMIN,ROLE_MANAGER,ROLE_DRIVER,ROLE_PARTNER] }
# allow unauthenticated to access front end login
- { path: ^/fe/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
# restrict front end access
- { path: ^/fe, roles: ROLE_USER } # or whatever the role is of your frontend user
# allow all other pages to be viewed by unauthenticated users
- { path: ^/, roles: IS_AUTHENTICATED_ANONYMOUSLY }