2015-12-18 18 views
7

私はSymfony 2.8で新しいLdapUserProviderを使用しようとしています。私はすべてを構成したと信じているper the docsSymfony 2.8でのLDAP認証

ユーザーが正常に認証され、保護されたページにリダイレクトされます。リダイレクト後に問題が始まる場所です。 symfonyは、認証されたユーザとしてバインドしようとしますが、パスワードがnullの場合、オープンされたLDAPによって拒否されます。

ここに関連するログエントリと設定値があります。

設定:

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

セキュリティ:

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 

とログファイル:

[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

ドキュメントはSymfony \ Component \ Security \ Ldap \ Ldapを使用すると言いますが、ドキュメントは間違っています。実際のクラスはSymfony \ Component \ Ldap \ LdapClientです。 –

+1

これはかなり深刻です。多分それについてGitHubの問題を開いてください? (そこにはより多くの可視性があります) –

答えて

0

Symfony 3.1では、LdapClientコンポーネントは廃止されました。だから私は解決策を更新したいと思った。このソリューションは、Symfony 2.8/2.9のアプリケーションでも動作するはずです。

#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

私はほぼ正確に同じ問題を抱えていました。強烈なデバッグの後、私はラインに来た:\Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken::__construct

:私はUsernamePasswordTokenはそもそもセッションストレージからが認証されていない来ていたことを、診断されているため

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

これは、問題でした。これは、既定のサービスのカスタムオーバーライドによって割り当てられた役割がないために発生しました。

通常、LDAPはログイン時に1回だけ呼び出され、セッションにはパスワードを保存しないでください。シリアライズされたトークンではauthenticated = trueのみです。

認証されていないトークンがシリアル化されていませんか。

4

最後に、問題が見つかりました。

あなたはチェーンUserProviderにあります

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

上記のプロバイダラインを追加すると、symfony 2.8 – Christian

+0

にエラーが表示されます。マークアップは少し壊れています。http://symfony.com/doc/2.8/security/multiple_user_providers.html – ahinze

1

私は同じ問題を抱えていました。私の場合、それはframework.session.handler_idの設定が間違っていた - 私はそれをデフォルトのPHPセッションハンドラであるnullにネイティブファイルハンドラから変更しなければならなかった。