Php Symfony 2多个提供程序不在secuirty.yml中工作

Php Symfony 2多个提供程序不在secuirty.yml中工作,php,symfony,symfony-2.3,symfony-2.7,Php,Symfony,Symfony 2.3,Symfony 2.7,我有多个proivders用户和管理员,因此我有以下security.yml security: encoders: AppBundle\Entity\AdminUser: bcrypt # https://symfony.com/doc/current/security.html#b-configuring-how-users-are-loaded providers: #in_memory: # memory: ~

我有多个proivders用户和管理员,因此我有以下security.yml

security:
    encoders:
        AppBundle\Entity\AdminUser: bcrypt
    # https://symfony.com/doc/current/security.html#b-configuring-how-users-are-loaded
    providers:
        #in_memory:
         #   memory: ~
        admin_db:
            entity: { class: AppBundle\Entity\AdminUser, property: email  }


    firewalls:
        # disables authentication for assets and the profiler, adapt it according to your needs
        dev:
            pattern: ^/(_(profiler|wdt)|css|images|js)/
            security: false

        admin_db:
            provider: admin_db
            anonymous: false
            form_login:
                login_path: login
                check_path: login



            # activate different ways to authenticate

            # https://symfony.com/doc/current/security.html#a-configuring-how-your-users-will-authenticate
            #http_basic: ~

            # https://symfony.com/doc/current/security/form_login_setup.html
            #form_login: ~


    access_control:
      - { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
      - { path: ^/, roles: ROLE_ADMIN }
但当我尝试访问登录页面时,我看到了这个错误

此页面无法工作。localhost已多次重定向您。尝试 清理你的饼干。错误\u太多\u重定向


问题在于,您的防火墙不允许使用
anonymous:false
指定的任何匿名访问。这意味着您的登录访问控制不起作用。解决此问题的两种常见方法是将登录路由从防火墙中移除,或者允许匿名访问,然后使用访问控制来要求角色

如果要将登录路由移出:

firewalls:
    login:
        pattern: ^/login$
        security: false

    admin_db:
        ...
        form_login:
            login_path: login
            check_path: login_check
重要的是,路由
login\u check
指向防火墙内的某些内容。因此,基本上除了
/login
之外的任何东西都可以工作,例如
登录/检查
。在控制器中,您可以为此创建一个空操作,也可以将其指向与登录相同的操作

另一种解决方案在您的情况下会更简单,因为您的
访问控制已经正确:

firewalls:
    admin_db:
        ...
        anonymous: ~

在访问控制中,您允许匿名登录,但所有其他路由必须具有
角色\u ADMIN
。因此,不需要进行其他更改。

问题在于,您的防火墙不允许使用
匿名:false指定的任何匿名访问。这意味着您的登录访问控制不起作用。解决此问题的两种常见方法是将登录路由从防火墙中移除,或者允许匿名访问,然后使用访问控制来要求角色

如果要将登录路由移出:

firewalls:
    login:
        pattern: ^/login$
        security: false

    admin_db:
        ...
        form_login:
            login_path: login
            check_path: login_check
重要的是,路由
login\u check
指向防火墙内的某些内容。因此,基本上除了
/login
之外的任何东西都可以工作,例如
登录/检查
。在控制器中,您可以为此创建一个空操作,也可以将其指向与登录相同的操作

另一种解决方案在您的情况下会更简单,因为您的
访问控制已经正确:

firewalls:
    admin_db:
        ...
        anonymous: ~

在访问控制中,您允许匿名登录,但所有其他路由必须具有
角色\u ADMIN
。因此,不需要进行其他更改。

@dbrumann.now我无法登录。没有错误,只需在输入Crednetic后重定向到登录。您的页面底部是否有探查器工具栏?如果是这样,请检查您的用户名是否出现或不出现。
然后单击用户名。它会将您发送到“安全”选项卡,该选项卡会为您提供更多详细信息。或者,查看日志以确定登录是否有效。从外观上看,我猜
模式:^/*
在您的
管理数据库
防火墙中缺失。@dbrumann.second方法很好。非常感谢。还删除了缓存。感谢您提供了很好的解决方案以及解释\@dbrumann。现在我无法登录。没有错误,只需在进入Crednetial后重定向到登录。您是否有profiler工具栏在你的页面底部?如果是这样,请检查您的用户名是否出现或不出现。
然后单击用户名。它会将您发送到“安全”选项卡,该选项卡会为您提供更多详细信息。或者,查看日志以确定登录是否有效。从外观上看,我猜
模式:^/*
在您的
管理数据库
防火墙中缺失。@dbrumann.second方法很好。非常感谢。还删除了缓存。感谢您提供了很好的解决方案,并解释了这一点\