Я хочу настроить в приложении, разработанном под symfony 4, систему аутентификации с использованием компонента LDAP.
Я уже тестировал напрямую, и я смог в контроллере получить данные пользователя (ов), используя:
$ldap = Ldap::create('ext_ldap', array(
'host' => 'my-server',
'encryption' => 'none',
));
...
Но мне нужно использовать форму входа в систему с полем userPrincipalName и полем пароля.
вот код:
#service.yaml
parameters:
ldap.host: XX.XX.XX.XX
services:
#...
App\Service\LdapConnection:
arguments: ['%ldap.host%', '%ldap.domain%']
Symfony\Component\Ldap\Ldap:
arguments: ['@Symfony\Component\Ldap\Adapter\ExtLdap\Adapter']
Symfony\Component\Ldap\Adapter\ExtLdap\Adapter:
arguments:
- host: '%ldap.host%'
port: 389
encryption: none
options:
protocol_version: 3
referrals: false
security:
providers:
#in_memory: { memory: ~ }
my_ldap:
ldap:
service: Symfony\Component\Ldap\Ldap
base_dn: dc=assoc,dc=org
search_dn: cn=read-only-,dc=assoc,dc=org
search_password: POeJKz1532
default_roles: ROLE_USER
uid_key: userPrincipalName
filter: ({uid_key} = {username})
firewalls:
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
main:
anonymous: ~
form_login_ldap:
provider: my_ldap
login_path: login
check_path: login_check
service: Symfony\Component\Ldap\Ldap
dn_string: '{username}@assoc.org'
query_string: '(&(sAMAccountName = {username})(DC=assoc,DC=org))'
access_control:
- { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/, roles: IS_AUTHENTICATED_FULLY }
<form action = "{{ path('login') }}" method = "post">
{% if error %}
<div class = "alert alert-danger" role = "alert">{{ error.messageKey|trans(error.messageData, 'security') }}</div>
{% endif %}
<input type = "hidden" name = "_csrf_token" value = "{{ csrf_token('authenticate') }}">
<label for = "username">Username</label>
<input type = "email" id = "username" name = "_username" value = "{{ last_username }}" required autofocus>
<label for = "password">Password</label>
<input type = "password" id = "password" name = "_password" required>
<button class = "btn btn-lg btn-primary btn-block" type = "submit">Sign in</button>
</form>
# SecurityController
/**
* @Route("/login", name = "login")
*/
public function login(Request $request, AuthenticationUtils $authenticationUtils)
{
// get the login error if there is one
$error = $authenticationUtils->getLastAuthenticationError();
// last username entered by the user
$lastUsername = $authenticationUtils->getLastUsername();
return $this->render('security/login.html.twig', array(
'last_username' => $lastUsername,
'error' => $error,
));
}
Любая идея ?? Спасибо
Решение
main:
anonymous: ~
form_login_ldap:
dn_string: '{username}'
Не нужно перемещать его за пределы формы, я все равно получаю сообщение о недопустимых учетных данных. Я тестировал с теми же параметрами, используя ldap_search, и он работает очень хорошо. Я думаю, что у меня что-то не так в security.yaml.
В журнале: security.INFO: Ошибка аутентификации. {"исключение": "[объект] (Symfony \\ Component \\ Security \\ Core \\ Exception \\ BadCredentia lsException (код: 0): неверные учетные данные. в / var / www / api / vendor / symfony / security / Core / Authentication / Provider / UserAuthenticationProvider.php: 67, Symfony \\ Component \\ Security \\ Core \\ Exception \\ UsernameNotFo undException (code: 0): User \ "только для чтения- @. org \ "не найдено.
Нашел решение: dn_string: '{username}'




В коде ветки формы входа теги ошибок «<div>» должны находиться за пределами тегов «<form>», иначе вы не увидите ошибок.