Symfony 2 Security.yml重定向循环和LogicException问题

时间:2013-04-24 09:32:43

标签: security symfony

好的,我想我需要亲手操作..

这个问题是上一个问题的后续问题: Symfony2 img/LdapBundle Bad credentials error

我把它拆分为另一个问题。我得到两个与security.yml文件有关的不同问题,如下所述。

我有我的security.yml:

security:
    firewalls:
        login_firewall:
            pattern:    ^/login$
            anonymous:  ~
            imag_ldap:
                check_path: login_check
                login_path: login
                csrf_provider: form.csrf_provider
                intention: authenticate
                provider: ldap
            logout:
                path:           /logout
                target:         /
        restricted_area:
            pattern:          ^/
            #anonymous:        ~ 
    providers:
        ldap:
           id: imag_ldap.security.user.provider

    encoders:
        IMAG\LdapBundle\User\LdapUser: plaintext

    access_control:
        - { path: ^/login,          roles: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/,               roles: IS_AUTHENTICATED_FULLY }

但是我收到以下错误: LogicException: No authentication listener registered for firewall "restricted_area".

所以我尝试了以下内容:

security:
    firewalls:
        login_firewall:
            pattern:    ^/login$
            anonymous:  ~
            imag_ldap:
                check_path: login_check
                login_path: login
                csrf_provider: form.csrf_provider
                intention: authenticate
                provider: ldap
            logout:
                path:           /logout
                target:         /
        restricted_area:
            pattern:          ^/
            #anonymous:        ~ 
            imag_ldap:
                check_path: login_check
                login_path: login
                csrf_provider: form.csrf_provider
                intention: authenticate
                provider: ldap
            logout:
                path:           /logout
                target:         /

但这会导致重定向循环。

有人能告诉我如何让它发挥作用吗?我正在尝试使用https://github.com/BorisMorel/LdapBundle ldap包来验证用户..

1 个答案:

答案 0 :(得分:2)

根据文档https://github.com/BorisMorel/LdapBundle#configure-securityyml,您应该有一个防火墙pattern: ^/,其中登录也会存在。

security:
    firewalls:
        restricted_area:
            pattern:    ^/
            anonymous:  ~
            imag_ldap:
                check_path: login_check
                login_path: login
                csrf_provider: form.csrf_provider
                intention: authenticate
                provider: ldap
            logout:
                path:           /logout
                target:         /
    providers:
        ldap:
           id: imag_ldap.security.user.provider

    encoders:
        IMAG\LdapBundle\User\LdapUser: plaintext

    access_control:
        - { path: ^/login$,         roles: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/,               roles: IS_AUTHENTICATED_FULLY }

您不需要身份验证的网站,您必须在acces_control下加入IS_AUTHENTICATED_ANONYMOUSLY角色。这也适用于dev-enivironment中的分析器和工具栏(实际上对于FOSU​​serBundle,但我认为这对LdapBundle也很重要)。是的,我知道symfony文档说要专门为^/login$创建一个匿名防火墙,但是如果bundle支持匿名角色,那么就可以使用acces_control将其排除在上面。

    - { path: ^/_wdt, role: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/_profiler, role: IS_AUTHENTICATED_ANONYMOUSLY }

修改: 并且不要忘记从包中导入路由定义而不是自定义它们。见https://github.com/BorisMorel/LdapBundle#import-routing