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

时间:2018-02-27 04:47:17

标签: 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: ~
        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重定向您太​​多次。尝试   清除你的cookie。 ERR_TOO_MANY_REDIRECTS

1 个答案:

答案 0 :(得分:3)

问题是您的防火墙不允许anonymous: false指定的任何匿名访问。这意味着您的登录访问控制不起作用。解决此问题的两种常见方法是将登录路径从防火墙中取出或允许匿名访问,然后使用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。因此,不需要进行其他更改。