Symfony 3 LDAP身份验证和登录表单错误:无法完成搜索

时间:2017-01-17 10:23:12

标签: ldap symfony

我正在研究Symfony 3.2项目,并尝试通过LDAP在公司的AD上实施身份验证过程。 我不了解AD和LDAP的所有内容,我通常更喜欢Linux prod环境,但我对这个项目知之甚少,Symfony理论上我需要的一切。

我遇到了不同的问题,具体取决于服务定义。

首先,公共代码

security.yml

provider_company_ldap:
            ldap:
                base_dn: dc=domaine,dc=local
                search_dn: ~
                search_password: ~
                service: company.ldap
                default_roles: ROLE_USER

company_ldap_firewall:
        anonymous: true
        provider:  provider_company_ldap
        form_login_ldap:
            service: company.ldap
            login_path: company_rhag_user_login
            check_path: company_rhag_user_check
            dn_string: 'sAMAccountName={username},ou=Utilisateurs,dc=domaine,dc=local'
        pattern: ^/

access_control:
    - { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/admin, roles: ROLE_ADMIN }
    - { path: ^/, roles: ROLE_USER }

CompanyBundle:用户:login.html.twig

<form action="{{ path('company_rhag_user_check') }}" method="post" class="form-horizontal">

        <div class="form-group">
            <label for="username" class="col-sm-2 control-label">
                Login :
            </label>
            <div class="col-sm-10">
                <input type="text" class="form-control" value="{{ last_username }}"
                    id="username" name="_username" required="required" />
            </div>
        </div>

        <div class="form-group">
            <label for="password" class="col-sm-2 control-label">
                Password :
            </label>
            <div class="col-sm-10">
                <input type="password" class="form-control" value=""
                    id="password"  name="_password" required="required" />
            </div>
        </div>

        <div class="form-group">
            <div class="col-sm-offset-2 col-sm-10">
                <button type="submit" class="btn" id="_submit" name="_submit">
                Connexion
                </button>
            </div>
        </div>
</form>

第一种情况:使用Ldap类

的服务

使用Ldap类,因为LdapClient已标记为已弃用,将在4.0中删除:

services:
    company.ldap:
        class: Symfony\Component\Ldap\Ldap
        arguments:
            - '%dbldap_host%'     # local ip for AD server

使用此服务,不能显示任何页面,错误消息为:

FatalThrowableError in Ldap.php line 28: Type error: Argument 1 passed to Symfony\Component\Ldap\Ldap::__construct() must be an instance of Symfony\Component\Ldap\Adapter\AdapterInterface, string given, called in C:\blahblahblah\var\cache\dev\appDevDebugProjectContainer.php on line 446

第二种情况:不推荐使用LdapClient类

所以,我尝试使用已弃用的类LdapClient类:

services:
    company.ldap:
        class: Symfony\Component\Ldap\LdapClient
        arguments:
            - '%dbldap_host%'     # local ip for AD server

有了这个,登录表单显示正确,Symfony的工具栏显示身份验证为anon。,并提到了company_ldap_firewall。如果我忽略了已弃用的警告,那么一切都很好。 在提交时,无论凭据是什么,我都收到了这样的信息:

Could not complete search with dn "dc=domaine,dc=local", query "(sAMAccountName=loginvalue)" and filters "*"

当然,最好的解决方案是使用非弃用的服务类,但此时,任何可行的解决方案都可以。

谢谢你的时间和帮助。

1 个答案:

答案 0 :(得分:0)

使用ldap类,您应该传入一个类型为AdapterInterface的参数而不是一个字符串(这会显示在您收到的错误消息中)。在文档中有一个很好的例子:

Symfony 3.2 - Authenticating against an LDAP server

services:
    ldap:
        class: Symfony\Component\Ldap\Ldap
        arguments: ['@ext_ldap_adapter']
    ext_ldap_adapter:
        class: Symfony\Component\Ldap\Adapter\ExtLdap\Adapter
        arguments:
            -   host: my-server
                port: 389
                encryption: tls
                options:
                    protocol_version: 3
                    referrals: false

ext_ldap_adapter服务的参数将是你的ldap配置。