我正在研究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类,因为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类:
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 "*"
当然,最好的解决方案是使用非弃用的服务类,但此时,任何可行的解决方案都可以。
谢谢你的时间和帮助。答案 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配置。