2016-10-21 2 views
0

個人的なプロジェクトの助けを借りて、自分自身を教えてください!PHP LDAP複数のバインド

シンプルなログインボックスを使用して、私たちのウェブサイトの特定のページをパスワードで保護したいと考えています。

マイlogin.phpページはユーザ名パスワード入力を備えたシンプルなログインフォームが含まれています。私は下のコードを使ってログインプロセスを動かすことができました。 Active Directoryのユーザー名/パスを使用してこのフォームからログインし、問題のないページに進むことができます。

しかし私はそれを「正しい」方法でやっているかどうかはわかりません。

マイコード;

ldap.php

session_start(); 

function authenticate($user, $password) { 
    if(empty($user) || empty($password)) return false; 
    $ldaphost = "ad.example.com"; 
    $ldap_dn = "DC=ad,DC=example,DC=com"; 
    $ldap_user_group = "Staff"; 
    $ldap_usr_dom = '@ad.example.com'; 
    $ldap = ldap_connect($ldaphost); 

    if($bind = ldap_bind($ldap, $user.$ldap_usr_dom, $password) or die ("Error: ".ldap_error($ldap))) { 
     $filter = "(sAMAccountName=".$user.")"; 
     $attr = array(""); 
     $result = ldap_search($ldap, $ldap_dn, $filter) or exit("Unable to search LDAP server") or die ("Error searching: ".ldap_error($ldap)); 
     $entries = ldap_get_entries($ldap, $result); 
     ldap_unbind($ldap); 
    } 

    foreach($entries[0]['memberof'] as $grps) { 
     if(empty($grps) || empty($ldap_user_group)) return false; 
     if(strpos($grps, $ldap_user_group)) { 
      $access = 1; 
     } else { 
     } 
    } 

    if($access != 0) { 
      $_SESSION['user'] = $user; 
      $_SESSION['access'] = $access; 
      return true; 
     } else { 
     return false; 
    } 
} 

私は次のように、この特定のLDAP認証プロセスは、二段階で動作する必要があること(他の誰かが)と言われてきました。

  • 入力したユーザー名が検索されます。このために検索ユーザーDNとパスワード(検索権限を持つユーザー)を使用することをお勧めします。検索を行う前に、これらの資格情報とバインドされます。検索が成功すると、検索されたユーザーのDNと後でメンバーレコードを検索するために使用される検索属性が取得されます
  • 次に、取得されたユーザーDNと入力されたパスワードを使用して2番目のバインドが作成されます。このバインドが成功すると、ユーザーは認証されます。

私の質問は次のとおりです。

  • 上記の記述は正しいですか?
  • 2つの「バインド」が必要ですか?
  • ユーザーが入力した資格情報でLDAP接続をバインドすることはできませんか?
  • 何かアドバイスが高く評価され

、私は本当に、認証プロセスのラウンド私の頭を取得するために苦労しています。■

答えて

1

ショート回答:

  • はい
  • はい
  • なし

長い回答: Curreユーザーのユーザー名と電子メールアドレスだけをバインドすることはできません。それはバックエンドとしてのADでのみ機能します。ですから、あなたはAD-Authenticatorをしたいと思っています。しかし、あなたは具体的にLDAP認証者を求めました。また、LDAPバインドはDNを「ユーザー名」としてのみ機能します。ほとんどのユーザは、ログイン時にメールアドレスやユーザ名を覚えやすくなることを知らないため、したがって、ユーザーのlogin-dataにDNを見つける必要があります。したがって、LDAPで検索する必要があり、バインドする必要があります。あなたがバインドする必要があるユーザーとしてバインドするには...その循環依存関係を回避するには、まずディレクトリへの読み取りアクセス権限を持つユーザーとしてバインドし、そのセッションを使用してユーザーのDNを検索する必要があります。見つかった場合は、そのDNとユーザー提供のパスワードを使用して、ユーザーの資格情報を確認するために2番目のバインドを実行します。

ちょうど2日前にzendconで話をしました。あなたはいくつかの例でスライドを見つけることができますhttp://rawgit.com/heiglandreas/slidedeck/master/Directory_Authentication_with_LDAP/20161019%20-%20zendcon/index_online.html

+0

これはあなたのスライドは非常に役立ちます - 私は以前の笑としている可能性があります:) –