Я пытаюсь аутентифицировать пользователей в моей компании для приложений Symfony3, используя Active Directory. Моя текущая конфигурация выглядит следующим образом (она также была успешно протестирована с онлайн-тестовым сервером LDAP, поэтому я могу подтвердить правильность конфигурации Symfony).
//services.yml
Symfony\Component\Ldap\Ldap:
arguments: ['@Symfony\Component\Ldap\Adapter\ExtLdap\Adapter']
Symfony\Component\Ldap\Adapter\ExtLdap\Adapter:
arguments:
- host: host.dom1.dom2.net
port: 389
encryption: none
options:
protocol_version: 3
referrals: false
//security.yml
my_ldap:
ldap:
service: Symfony\Component\Ldap\Ldap
base_dn: dc=dom1,dc=dom2,dc=net
search_dn: "cn=myUsername,dc=dom1,dc=dom2,dc=net"search_password: myPassword
default_roles: ROLE_ADMIN
uid_key: sAMAccountName
....
firewalls:
form_login_ldap:
provider: my_ldap
service: Symfony\Component\Ldap\Ldap
dn_string: 'sAMAccountName={username},dc=dom1,dc=dom2,dc=net'
login_path: login
check_path: login
default_target_path: /index
Когда я пытаюсь войти, мне будет отказано на основании «неверных учетных данных», хотя я уверен, что мои учетные данные вводятся правильно. Я надеюсь, что основной проблемой здесь является то, что «search_dn» & «search_password» мои, и у меня нет прав администратора в нашей AD. Похоже (согласно документации Symfony) эти кредиты должны принадлежать администратору AD. Я жду этой информации от моего системного администратора, но она должна была пройти по цепочке, поэтому это может занять некоторое время. Я попытался заменить их обоих нулями, который выдает другую ошибку.
Мой вопрос приходит в этот момент, так как я на самом деле могу установить успешное соединение & связать с нашей AD, используя только PHP с помощью следующего кода:
//ldapconnect.php
$ldap = ldap_connect("host.dom1.dom2.net");
if (ldap_bind($ldap, "[email protected]", "myPassword")) {
echo "login successful";
} else {
echo "Incorrect Login";
}
По сути, я смотрю, смогу ли я каким-либо образом воспроизвести вышеупомянутый автономный код привязки PHP ldap в моем проекте Symfony (кажется, что причиной является проблема в строке dn, необходимой в Symfony). Я довольно новичок в этом, поэтому я не могу понять, почему автономный код PHP разрешает связывание LDAP, в то время как использование строки dn этого не делает (кроме того, что наша AD, возможно, блокирует запрос, когда используется строка dn).
Заранее благодарю за любую помощь.
Редактировать: обновлен поиском только для администратора.
//security.yml
my_ldap:
ldap:
service: Symfony\Component\Ldap\Ldap
base_dn: 'CN=Users,dc=dom1,dc=dom2,dc=net'
search_dn: "cn=ReadOnlyAdmin,OU=ou1,OU=ou2,dc=dom1,dc=dom2,dc=net"search_password: adminPass
default_roles: ROLE_USER
uid_key: sAMAccountName
....
firewalls:
http_basic_ldap:
provider: my_ldap
service: Symfony\Component\Ldap\Ldap
dn_string: 'DOMAIN\{username}'
Похоже, что теперь я, по крайней мере, могу привязаться к серверу ldap, однако я все еще получаю неверные учетные данные с ошибкой «пользователь не найден»:
//dev.log
[2017-09-11 13:10:15] request.INFO: Matched route "app_default_admin". {"route":"app_default_admin","route_parameters":{"_controller":"AppBundle\\Controller\\DefaultController::adminAction","_route":"app_default_admin"},"request_uri":"http://localhost:8000/index","method":"GET"} []
[2017-09-11 13:10:15] security.INFO: Basic authentication Authorization header found for user. {"username":"myUsername"} []
[2017-09-11 13:10:15] security.INFO: Basic authentication failed for user. {"username":"myUsername","exception":"[object] (Symfony\\Component\\Security\\Core\\Exception\\BadCredentialsException(code: 0): Bad credentials. at C:\\pathtoSymfonyProject\\vendor\\symfony\\symfony\\src\\Symfony\\Component\\Security\\Core\\Authentication\\Provider\\UserAuthenticationProvider.php:73, Symfony\\Component\\Security\\Core\\Exception\\UsernameNotFoundException(code: 0): User \"myUsername\" not found. at C:\\pathtoSymfonyProject\\vendor\\symfony\\symfony\\src\\Symfony\\Component\\Security\\Core\\User\\LdapUserProvider.php:82)"} []
Я также подвергаю сомнению эту ошибку «User \» myUsername \ «not found» ближе к концу третьей строки, выполняет ли поиск в AD имя пользователя «myUsername \» и добавляет обратную косую черту? Это может быть просто формат кода ошибки, так как он выглядит правильным во второй строке и начале третьей строки.
Редактировать 2:
Я, наконец, установил соединение, правильная конфигурация выглядит следующим образом:
//security.yml
my_ldap:
ldap:
service: Symfony\Component\Ldap\Ldap
base_dn: 'dc=dom1,dc=dom2,dc=net'
search_dn: "cn=ReadOnlyAdmin,OU=ou1,OU=ou2,dc=dom1,dc=dom2,dc=net"search_password: 'adminPass'
default_roles: ROLE_USER
uid_key: sAMAccountName
....
firewalls:
http_basic_ldap:
provider: my_ldap
service: Symfony\Component\Ldap\Ldap
dn_string: 'MYDOMAIN\{username}'
Из моего предыдущего редактирования все, что мне нужно было сделать, это удалить «CN = Users» из base_dn, так как учетные записи пользователей там фактически не находились, удалив это и просто оставив компоненты домена, что позволило всей нашей AD найти пользователя. Еще одно важное замечание: dn_string должен быть настроен как
‘MYDOMAIN \ {username}’, иначе аутентификация не пройдет (согласно ответу Элвина Банка). Как указывает Элвин в своей статье, ссылки на которую приведены ниже, эта часть, к сожалению, не упоминается в документации Symfony LDAP.
Взгляните на мою недавнюю статью об этом:
https://alvinbunk.wordpress.com/2017/09/07/symfony-ldap-component-ad-authentication/
Я подозреваю, что вам просто нужно изменить свой dn_string
вот так:
dn_string: 'DOMAIN\{username}'
Пожалуйста, прочитайте мою статью. Также попробуйте:
default_roles: ROLE_USER
Вы также можете попробовать использовать http_basic_ldap
согласно моей статье и проверьте журнал разработки. Это, наверное, что-то простое — не сдавайся!
Других решений пока нет …