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 }