私たちは現在、当サイトの基本ログインページ(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の関係にあることを確認してください。 – Oliver