Php 在Symfony 3中使用不同的登录表单

Php 在Symfony 3中使用不同的登录表单,php,authentication,login,symfony,roles,Php,Authentication,Login,Symfony,Roles,以下设置: 我有两个不同的用户登录部分 第一个用户是普通用户(实体:AppBundle:user),第二个用户是管理员(实体:AppBundle:admin) 我有两种不同的登录路径,提供者、防火墙和编码器。 我可以以用户或管理员身份登录和注销,没有问题 问题是: 如果管理员已经登录,我需要他留在管理域,不能访问用户登录。同样对于普通用户,如果他已经以用户身份登录,则他不能以管理员身份登录 所以问题是,如果管理员登录,他仍然可以切换到用户登录域并以用户身份登录,会话将同时包含用户和管理员 sec

以下设置:

我有两个不同的用户登录部分

第一个用户是普通用户(实体:AppBundle:user),第二个用户是管理员(实体:AppBundle:admin)

我有两种不同的登录路径,提供者、防火墙和编码器。 我可以以用户或管理员身份登录和注销,没有问题

问题是:

如果管理员已经登录,我需要他留在管理域,不能访问用户登录。同样对于普通用户,如果他已经以用户身份登录,则他不能以管理员身份登录

所以问题是,如果管理员登录,他仍然可以切换到用户登录域并以用户身份登录,会话将同时包含用户和管理员

security.yml:

providers:
    admin_db_provider:
        name: admin_provider
        entity:
            class: AppBundle:Admin
        ...
    user_db_provider:
        name: user_provider
        entity:
            class: AppBundle:User
        ...
firewalls:
    admin_secured_domain:
        pattern: ^/admin
        anonymous: ~
        provider: admin_provider
        form_login:
            login_path: admin.authentication
            check_path: admin.authentication
            username_parameter: userName
            pasword_parameter: password
        ...
    user_secured_domain:
        pattern: ^/user
        anonymous: ~
        provider: user_provider
        form_login:
            login_path: user.authentication
            check_path: user.authentication
            username_parameter: userName
            pasword_parameter: password
        ...
access_control:
    - { path: ^/user/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/admin/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
encoders:
    ...
我假设发生这种情况是因为我使用两个不同的提供者进行登录检查

当我以用户身份登录并访问管理员登录时,我可以在Symfony profiler中看到用户从“user”切换到“anon”。管理员也是如此,如果我以管理员身份登录并访问用户登录,它将从“admin”切换到“anon”


我只需要将它们重定向回其域,但此时我无法检查角色。

您要查找的是“安全上下文”

见以下类似问题:

如果希望来自不同防火墙的用户共享相同的安全上下文,则必须为不同防火墙定义相同的上下文:

# app/config/security.yml
security:
    # ...
    firewalls:
        admin_secured_domain:
            # ...
            context: my_context
        user_secured_domain:
            # ...
            context: my_context
有关安全上下文,请参阅symfony文档:

大多数应用程序只需要一个防火墙。但是,如果您的应用程序确实使用多个防火墙,您会注意到,如果您在一个防火墙中进行了身份验证,则不会在另一个防火墙中自动进行身份验证。换句话说,这些系统并不共享一个共同的“上下文”:每个防火墙就像一个单独的安全系统