web-dev-qa-db-ja.com

LDAPユーザーの同期

ユーザーのソースとしてLDAPを使用しています。これは正常に機能し、誰でもLDAP情報を使用してログインするだけで、そのユーザーのDrupalユーザーが作成されます。ただし、私たちの要件の1つは、(検索可能な)ユーザーのリストを持つことです。これは、新しいエントリや変更されたエントリがないかLDAPを定期的にチェックし、それらをdrupalユーザーとマージする必要があることを意味します。

LDAP for Drupal 7 module には、LDAPプロビジョニングをトリガーするイベントのリストがあります。そのうちの1つはOn cron runs. Not implemented yet.これは基本的に必要なものなので、この状態については何も見つかりませんでした。

ウェブサイトを新しいバージョンに移行する際の問題のため、現在コミュニティモジュールを使用するようにすべてを書き直そうとしています。したがって、公式のソリューションをお勧めします。現在、ユーザーリストをLDAPクエリビューに切り替えていますが、これは一時的な解決策にすぎません。

1
Erik S

私はLDAPを使用しており、cronの実行に関する機能を実行して、ログインによってまだ作成されていないユーザー(特定の役割の)を自動的に作成しました

これがお役に立てば幸いです

function _synchro_ldap(){

  $server = "serveur.com";
  $rootdn = "name";
  $rootpw = "pwd";
  $ds = ldap_connect( $server );
  $r = ldap_bind( $ds, $rootdn, $rootpw );

  $dn = "OU=AAAAA,OU=BBBB";

  $filtre="cn=test";

  $sr = ldap_search($ds, $dn, $filtre); 

  $info = ldap_get_entries($ds, $sr);

  for ($i = 0; $i < $info[0]["member"]["count"]; $i++) {

    $sr2 = ldap_search($ds, $info[0]["member"][$i], "cn=*");

    $info2 = ldap_get_entries($ds, $sr2);   

    $name       = $info2[0]["samaccountname"][0];
    $mail       = $info2[0]["mail"][0];
    $nom        = $info2[0]["sn"][0];
    $prenom     = $info2[0]["givenname"][0];
    $dn         = $info2[0]["distinguishedname"][0];

    if( !empty($mail) && !empty($name) && $name!= "admin" ){

        $u = user_load(array("name" => $name));
        $m = user_load(array("mail" => $mail));


        if( !$u && !$m) { // user does not exist in drupal

            // Create a user
            $details = array(
                'name'                  => $info2[0]["samaccountname"][0],
                'mail'                  => $info2[0]["mail"][0],
                'access'                => 0,
                'status'                => 1,
                'ldap_authentified'     => TRUE,
                'ldap_dn'               => $dn,
                'ldap_config'           => "1"
            );

            $u = user_save( null, $details ); // Creation du user
            $user_id = $u->uid;             
            user_multiple_role_edit( array( $user_id ), "add_role", $role_id_custom );  
        }
    }
  } 
  ldap_close( $ds );
}
3
pico34

OK。これは古い質問です...しかし、私は何時間もの仕事の後に見つけた答えを出したいと思います。

LDAPからすべてのユーザーをインポートする(つまりDrupalユーザーを作成する)には、まず 'all_employees' on admin/config/people/ldap/queryページ。これは、クエリのマシン名である必要があります。クエリが、必要なすべてのユーザーを返すことを確認してくださいインポート。

次に、組み込みLDAP機能を使用してLDAPユーザーをインポートするカスタムモジュールで使用できる関数を示します。

function importUsers($ldap_query_id='all_employees') {
  $ldapQuery = ldap_query_get_queries($ldap_query_id, 'all', TRUE, TRUE);
  $ldap_users = $ldapQuery->query();

  foreach ($ldap_users as $ldap_user) {
    $username = $ldap_user['samaccountname'][0];
    if (!empty($username)) {

      $ldap_user_conf = ldap_user_conf();
      $user_edit = array('name' => $username);
      $save = true;
      $ldap_user_conf->provisionDrupalAccount(NULL, $user_edit, NULL, $save);

    }
  }   
}

LDAPのユーザーがすでにいる場合は警告またはエラーが発生する可能性がありますが、問題はありません。

1
salihcenap

LDAPフィードを探しているようです https://www.drupal.org/node/1300812 これは、これまで細かく行ってきました。 LDAPユーザーモジュールは認証のみを処理し、ユーザーがログインしたときにのみトリガーします。しかし、スタッフリストについては、CMSを使用することのない他の90%のスタッフも更新する必要がありました。 LDAPフィードはそれを行い、LDAPからの追加のデータフィールドをDrupal 7ユーザーアカウントに同期することもできます。

毎晩実行しています。結果の例は次のとおりです(下の表) https://www.niwa.co.nz/atmosphere/key-contacts

残っている最大の問題は、ユーザーがLDAPから姿を消した後、スタッフリストからユーザーを削除することでした-これはまだトリッキーです。

0
dman