2017-10-05 53 views
1

私たちは現在、当サイトの基本ログインページ(login.php)とLDAPを使用してドメインに対してユーザーを認証する機能を含む別のスクリプト(auth.php)を持っています。すべてのユーザーが同じレベルのアクセス権を持っていれば、変更する必要があります。PHP経由でのLDAP認証 - アクセスグループ

現在、ユーザーがログインすると、メンバーであるすべてのグループを取得します。グループを繰り返して、ADグループの1つを介してシステムにアクセスできるかどうかを確認します。彼らがそうするなら、彼らはサイトに進むことができます。

サイトに認証されたすべてのユーザーがすべてのコンテンツにアクセスできないようにするため、これを変更する必要があります。ユーザーが認証されると、ページレベルのアクセスレベルを設定する必要があります。ユーザーは複数のアクセスグループに割り当てられている可能性があるため、最も低いレベルのアクセスのみを提供したいと考えています。

セッション変数を使用してアクセスレベルを設定し、次にページレベルアクセスに次のようなものを使用します。

if ($_SESSION['access'] != 3) 
    { 
    // user is logged in but not a ops team member, let's stop him 
    die("Access Denied"); 
    } 

以下は現在のauth.phpスクリプトです。

login.php:

include("auth.php"); 

auth.php

<?php 
session_start(); // Initialize session 
function authenticate($user, $password) 
    { 
    $ldap_host = "example.com"; // Active Directory server 
    $ldap_dn = "DC=example,DC=com"; // Active Directory DN 
    $ldap_manager_group = "Group_1"; // Active Directory manager group 
    $ldap_ops_group = "Group_2"; // Active Directory ops group 
    $ldap_eng_group = "Group_3"; // Active Directory eng group 
    $ldap_eng2_group = "Group_4"; // Active Directory other eng group 
    $ldap_usr_dom = "@example.com"; // Domain, for purposes of constructing $user 
    $ldap = ldap_connect($ldap_host); // connect to active directory 

    if ($bind = @ldap_bind($ldap, $user . $ldap_usr_dom, $password)) // verify user and password 
     { 
     // valid 
     // check presence in groups 
     $filter = "(sAMAccountName=" . $user . ")"; 
     $attr = array(
      "memberof", 
      "cn", 
      "givenname", 
      "sn" 
     ); 
     $result = ldap_search($ldap, $ldap_dn, $filter, $attr) or exit("Unable to search LDAP server"); 
     $entries = ldap_get_entries($ldap, $result); 
     $givenname = $entries[0]['givenname'][0]; 
     $surname = $entries[0]['sn'][0]; 
     ldap_unbind($ldap); 

     foreach($entries[0]['memberof'] as $grps) // check groups 
      { 
      if (strpos($grps, $ldap_manager_group)) // is manager, break loop 
       { 
       $access = 4; 
       $group = $ldap_manager_group; 
       break; 
       } 

      if (strpos($grps, $ldap_ops_group)) $access = 3; // is ops team 
      $group = $ldap_ops_group; 

      if (strpos($grps, $ldap_eng_group)) $access = 2; // is eng team 
      $group = $ldap_eng_group; 

      if (strpos($grps, $ldap_eng2_group)) $access = 1; // is eng2 team 
      $group = $ldap_eng2_group; 
      } 

     if ($access != 0) 
      { 
      // establish session variables 
      $_SESSION['user'] = $user; 
      $_SESSION['access'] = $access; 
      $_SESSION['access_group'] = $group; 
      $_SESSION['givenname'] = $givenname; 
      $_SESSION['sn'] = $surname; 
      return true; 
      } 
      else 
      { 
      return false; // user has no rights 
      } 
     } 
     else 
     { 
     return false; // invalid name or password 
     } 
    } 
?> 

私たちは以下のように、各アクセスレベル用の新しいアクセス・グループの作成について考えている:

  • $ access = 1#レポートへのアクセス(group =報告にsite_reporting)
  • $アクセス= 2回の#アクセス+ content3(グループ= site_ops)
  • $アクセス=レポートに3回の#アクセス+ content1(グループ= site_content1)
  • $アクセス=レポートに4回の#アクセス+ content2(グループ= site_content2)
  • $アクセス= 9#管理者(グループ= site_admin)

しかし、私たちは私たちのアクセス・グループのすべてのために、すべてのLDAPメンバーシップを検索し、最低のアクセス値を代入する方法を混同しています。

私たちはこれがうまくいくと思っていましたが、LDAPからの配列の出力とは一致しません。

$grps = array(
    $entries[0]['memberof'] 
); 

if (in_array('site_reporting', $grps)) 
    { 
    $access = 1; 
    } 
elseif (in_array('site_ops', $grps)) 
    { 
    $access = 2; 
    } 
elseif (in_array('site_content1', $grps)) 
    { 
    $access = 3; 
    } 
elseif (in_array('site_content2', $grps)) 
    { 
    $access = 4; 
    } 
elseif (in_array('site_admin', $grps)) 
    { 
    $access = 9; 
    } 

助けていただければ幸いです!ありがとう!

+1

あなたの広告にこれらのグループが含まれていれば、あなたのコードはあなたの意見になる方法です。しかし、各ユーザーが自分のグループと1-1の関係にあることを確認してください。 – Oliver

答えて

1

私は、あなたのクエリがADスキーマ(CN、OU、DCなど)を取り戻していますが、ADグループ名だけで一致させようとしているため、一致しないと考えます。

foreachループを使用して、explodeを使用してグループ名と結果のみを新しい配列に分割することをお勧めします。その後、その配列をif \ elseステートメントの干草地として使用します。