2015-12-18 12 views
7

Ich versuche, den neuen LdapUserProvider in Symfony 2.8 zu verwenden. Ich glaube, ich habe alles konfiguriert per the docs.LDAP-Authentifizierung mit Symfony 2.8

Mein Benutzer kann erfolgreich authentifiziert werden und wird dann auf die gesicherte Seite umgeleitet. Nach der Umleitung beginnt das Problem. Symfony versucht, als authentifizierter Benutzer zu binden, aber mit einem Null-Kennwort, das von open ldap zurückgewiesen wird.

Hier sind die relevanten Protokolleinträge und Konfigurationswerte.

Config:

services: 
    app.ldap: 
     class: Symfony\Component\Ldap\LdapClient 
     arguments: [ "localhost" ] 

Sicherheit:

security: 
    firewalls: 
     restricted_area: 
      provider: app_users 
      form_login_ldap: 
       service: app.ldap 
       dn_string: "uid={username},DC=mydomain,DC=net" 
       check_path: login_check 
       login_path: login 
    providers: 
     app_users: 
      ldap: 
       service: app.ldap 
       base_dn: dc=mydomain,dc=net 
       search_dn: cn=Manager,DC=mydomain,DC=net 
       search_password: secretPassword 
       filter: "(&(aptAccountEnabled=1)(ObjectClass=aptAccount)(uid={username}))" 
       default_roles: ROLE_USER 

und die Protokolldatei:

[2015-12-18 13:55:11] request.INFO: Matched route "login_check". {"route_parameters":{"_route":"login_check"},"request_uri":"http://ancdev.admin.aptalaska.net/~dmorphis/Portal/web/app_dev.php/Login/Verify"} [] 
[2015-12-18 13:55:11] security.DEBUG: Read existing security token from the session. {"key":"_security_restricted_area"} [] 
[2015-12-18 13:55:11] security.DEBUG: User was reloaded from a user provider. {"username":"dan.smartrg","provider":"Symfony\\Component\\Security\\Core\\User\\LdapUserProvider"} [] 
[2015-12-18 13:55:26] security.INFO: User has been authenticated successfully. {"username":"dan.smartrg"} [] 
<snip> 
[2015-12-18 13:55:26] security.DEBUG: Stored the security token in the session. {"key":"_security_restricted_area"} [] 
<snip> 
[2015-12-18 13:55:27] request.INFO: Matched route "home.index". {"route_parameters":{"_controller":"Apt\\PortalBundle\\Controller\\DefaultController::indexAction","_route":"home.index"},"request_uri":"http://ancdev.admin.aptalaska.net/~dmorphis/Portal/web/app_dev.php/"} [] 
[2015-12-18 13:55:28] security.DEBUG: Read existing security token from the session. {"key":"_security_restricted_area"} [] 
[2015-12-18 13:55:28] security.DEBUG: User was reloaded from a user provider. {"username":"dan.smartrg","provider":"Symfony\\Component\\Security\\Core\\User\\LdapUserProvider"} [] 
[2015-12-18 13:56:15] php.DEBUG: ldap_bind(): Unable to bind to server: Server is unwilling to perform {"type":2,"file":"/home/dmorphis/public_html/Portal/vendor/symfony/symfony/src/Symfony/Component/Ldap/LdapClient.php","line":73,"level":28928} [] 
[2015-12-18 13:56:15] app.ERROR: Bad credentials. [{"file":"/home/dmorphis/public_html/Portal/app/cache/dev/classes.php","line":2697,"function":"authenticate","class":"Symfony\\Component\\Security\\Core\\Authentication\\Provider\\UserAuthenticationProvide <truncated> 
[2015-12-18 13:56:15] security.INFO: An AuthenticationException was thrown; redirecting to authentication entry point. 
+0

Die Dokumentation sagt Symfony \ Component \ Security \ Ldap \ Ldap, aber die Dokumente sind falsch. Die eigentliche Klasse ist Symfony \ Component \ Ldap \ LdapClient –

+1

Dies scheint ziemlich ernst. Vielleicht ein Problem auf GitHub darüber auf? (es hat viel mehr Sichtbarkeit dort) –

Antwort

0

In Symfony 3.1 war die LdapClient-Komponente veraltet. Also wollte ich die Lösung aktualisieren. Diese Lösung sollte auch für Symfony 2.8/2.9 Apps funktionieren.

#security.yml 
security: 
    firewalls: 
     restricted_area: 
      provider: app_users 
      form_login_ldap: 
       service: ldap.auth 
       dn_string: "%dn_string%" 

    providers: 
     app_users: 
      ldap: 
       service: ldap.auth 
       base_dn: "dc=domain,dc=net" 
       search_dn: "cn=Manager,DC=domain,DC=net" 
       search_password: secretPassword 
       filter: "(&(aptAccountEnabled=1)(ObjectClass=aptAccount)({uid_key}={username}))" 
       default_roles: ROLE_USER 
       uid_key: uid 

#services.yml 
services: 
    ldap.auth: 
     class: 'Symfony\Component\Ldap\Ldap' 
     factory: 
      - 'Symfony\Component\Ldap\Ldap' 
      - 'create' 
     arguments: 
      - 'ext_ldap' # adapter 
      - 
       host: database 
       options: 
        protocol_version: 3 
0

ich das gleiche Problem fast genau hatte. Nach intensivem Debugging, kam ich zu der Zeile:

in \Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken::__construct:

parent::setAuthenticated(count($roles) > 0); 

Das war ein Problem, weil ich festgestellt, dass UsernamePasswordToken unauthenticated von Sitzungsspeicher zu beginnen kommen würde. Dies wurde dadurch verursacht, dass aufgrund der benutzerdefinierten Überschreibung von Standarddiensten keine Rollen zugewiesen wurden.

Normalerweise wird LDAP nur einmal bei der Anmeldung aufgerufen und kein Passwort sollte in der Sitzung gespeichert werden. Nur authenticated = true im serialisierten Token.

Sind Sie sicher, dass Sie ein unsialisiertes authentifiziertes Token erhalten?

4

Endlich fand ich, was das Problem war.

Sie müssen Kette der UserProvider:

chain_provider: 
    chain: 
      providers: [in_memory, app_users] 
    in_memory: 
     memory: ~ 
    app_users: 
     ldap: 
      .....</i> 
+0

das Hinzufügen der Anbieter Zeile oben gibt mir einen Fehler auf symfony 2.8 – Christian

+0

das Markup ist ein bisschen kaputt, hier: http://symfony.com/doc/2.8/security/multiple_user_providers.html – ahinze

1

ich gleiche Problem hatte. In meinem Fall war es falsch Konfiguration von framework.session.handler_id - ich musste es von nativen Dateihandler zu Null ändern, die Standard-PHP-Session-Handler ist.

Verwandte Themen