Symfony 2 多个提供商无法在 secuirty.yml 中工作

Symfony 2 Multiple providers not working in secuirty.yml

我有多个提供者用户和管理员,所以我关注 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 }

但是当我尝试访问登录页面时,我看到了这个错误

This page isn’t working localhost redirected you too many times. Try clearing your cookies. ERR_TOO_MANY_REDIRECTS

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

如果要将登录路由移出:

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

    admin_db:
        ...
        form_login:
            login_path: login
            check_path: login_check

重要的是路由 login_check 指向防火墙内的某处。所以基本上除了 /login 之外的任何东西都可以工作,例如login/check。在您的控制器中,您可以为此创建一个空操作,也可以将其指向与登录相同的操作。

对于你的情况,另一个解决方案会更简单,因为你的 access_control 已经正确了:

firewalls:
    admin_db:
        ...
        anonymous: ~

在您的访问控制中,您允许匿名访问登录,但所有其他路由必须具有 ROLE_ADMIN。因此,无需进行其他更改。