2016-10-24 13 views
0

でダイナミックドメインネームシステムを使用してLDAP上のユーザーのパスワードを確認するチェックすることができますが、はSF3 symfonyの3パスワードでsymfonyの3

dn_string: 'uid={username},dc=example,dc=com' 

DN静的でだから私は

自分UserAuthenticationProviderクラスを作成した。しかし、今、私私のsecurity.ymlで宣言する方法を知らない?

のsecurity.yml

providers: 

    your_db_provider: 
     entity: 
      class: AcSecurityBundle:User 
      property: username 
    fos_userbundle: 
     id: fos_user.user_provider.username 

    secured_area: 
     pattern: ^/ 
     anonymous: true 
     provider: your_db_provider 
     form_login: 
      csrf_token_generator: security.csrf.token_manager 
      use_referer: true 
     form_login_ldap: 
      service: ldap 
      use_referer: true 
     logout: true 

AcSecurityBundle/AcUserAuthenticationProvider.php

クラスAcUserAuthenticationProviderは{

function checkAuthentication(UserInterface $user, UsernamePasswordToken $token) 
{ 
    $username = $token->getUsername(); 
    $password = $token->getCredentials(); 

    if ('' === $password) { 
     throw new BadCredentialsException('The presented password must not be empty.'); 
    } 

    try { 
     $query = "(sAMAccountName=$username)"; 

     $search_dn = "CN=app,OU=apps,DC=domain,DC=be"; 
     $search_password = "mdp"; 
     $this->ldap->bind($search_dn, $search_password); 

     $t = $this->ldap->query("OU=At,OU=user,DC=domain,DC=be", $query); 

     $entry = $t->execute(); 

     if ($entry->count() > 0) { 
      $dn = $entry[0]->getDn(); 
     } 

     $this->ldap->bind($dn, $password); 
    } catch (ConnectionException $e) { 
     throw new BadCredentialsException('The presented password is invalid.'); 
    } 
} 

}

01 UserAuthenticationProvider延び

ありがとうございます

+0

私はそれを正しく読むと、その実装を再考するでしょう。まず、認証のためにここで属性「sAMAccountName」を配線しています。これにより、認証プロバイダはADバックエンドでのみ使用可能になります。次に、$ entry-> count()が複数の場合はどうなりますか? – heiglandreas

+0

はい私はADバックエンドを持っています。私のコードが動作します。これは心配ではありません。 symfonyが自分自身(ベンダー/ symfony/symfony/src/Symfony /コンポーネント/セキュリティ/コア/認証/プロバイダ/ LdapBindAuthenticationProvider.php)の代わりに1つを使用するように私のauthenficationプロバイダを宣言することです。 – Jsenechal

+0

なぜあなたは独自の実装をロールバックしますか?デフォルトのシンフォニー・プロバイダとは何が違うのですか? – heiglandreas

答えて

0

あなたは上記のいずれかを行う必要はありません。実際にADは、(例えばsAMAccountNameのか、UPNなど)完全なDNに加えて、いくつかのバインドメソッドをサポートしているのでaccording to the docs .Thisが動作するデフォルト値です

dn_string: '{username}'

:君はDN文字列を使用することができます。

+0

私はこれがADでのみ機能することを強調したいと思います。技術的にはLDAPの質問ではありません! – heiglandreas

+0

@heiglandreas彼はこれがAD環境のためのものであると明確に述べています。これが企業向けのアプリケーションで、ADバックエンドを使用している場合は、AD固有の機能を使用することに問題はありません。 – ChadSikorra

+0

Active Directoryにする必要があるときにLDAPでタグ付けされています...それはすべて私が言っていることです。 – heiglandreas

1

のSymfony 3.1 symfonyは新しいLDAPプロバイダを使用しているので
のSymfony \コンポーネント\のLdap \のLdap

プロバイダ例:

services: 

app.ldap: 
    class: Symfony\Component\Ldap\Ldap 
    factory: [ 'Symfony\Component\Ldap\Ldap', 'create'] 
    arguments: 
     - ext_ldap 
     - host: srv-host 
      #debug: true 

アダプタに関連付けられた文字列あなたは使いたい。
現在は がサポートされています。これはext_ldapです。
New Ldap provider by Symfony, explained.

セキュリティプロバイダ例:

providers: 
    #webservice_provider: 
     #id: app.webservice_user_provider 
    company_ldap: 
     ldap: 
      service: app.ldap 
      base_dn: DC=example, DC=local 
      search_dn: "CN=AdminName,OU=YourAdminGroup,DC=example,DC=LOCAL" 
      search_password: 'AdminPass' 
      default_roles: ROLE_USER 

今、あなたがお使いのLDAPシステムに見えるように許可されています。
あなたが右form_login_ldapあなた を設定した場合、ユーザーは自分のフォームを使って、例form_login_ldap

セキュリティ認証することができます:

form_login_ldap: 
    provider: company_ldap 
    service: app.ldap #system/provider your user authenticate to 
    dn_string: '{username}@example.local' 
    csrf_token_generator: security.csrf.token_manager 
    check_path: /login_check #make sure the check is behind the firewall 
    login_path: /login #make sure login IS_AUTHENTICATED_ANONYMOUSLY 

    logout:  
     path: /logout #logout path 
     target: /login #after logout redirect to login 
    anonymous: true 

ACCESS_CONTROL /ファイアウォール例:今すぐ

access_control: 
    - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY } 
    - { path: ^/admin/, role: ROLE_ADMIN } 
    - { path: ^/, role: ROLE_USER } #all pages require user to be logged in 

を動的なLDAPログインフォームがあります。 Symfony login form setup

希望すると、これが役立ちます。私自身8日間このことを理解しました。

+0

あなたの助けをありがとう あなたの方法は私の問題を解決しません:それは常に静的なdnです ユーザーの存在が(コンポーネント/セキュリティ/コア/ユーザー/ LdapUserProvider.php)が正常に読み込まれた後 Sfはログインパスワードをチェックします単純なバインドを使用して(コンポーネント/セキュリティ/コア/認証/プロバイダー/ LdapBindAuthenticationProvider.php) しかし、それはundepreciated ldapクライアントクラスを使用する正しい設定を見つけたことは素晴らしいです;-) – Jsenechal