【发布时间】:2018-03-17 15:35:53
【问题描述】:
我们目前有一个用于我们网站的基本登录页面 (login.php) 和一个单独的脚本 (auth.php),其中包括通过 LDAP 针对域对用户进行身份验证的功能。登录后,所有用户都拥有相同级别的访问权限,我们希望对其进行更改。
目前,当用户登录时,我们会抓取他们所属的所有组。然后,我们遍历这些组以查看他们是否可以通过我们的 AD 组之一访问系统。如果他们这样做了,他们就能够进入该站点。
因为我们不希望通过网站身份验证的每个人都可以访问所有内容,所以我们想要改变这一点。一旦用户通过身份验证,我们希望设置页面级别的访问级别。而且因为一个用户可能被分配到多个访问组,我们只想给他们最低级别的访问权限。
我们将使用 session 变量来设置访问级别,然后使用类似以下的内容进行页面级别访问。
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 # 访问报告(组 = site_reporting)
- $access = 2 # 报告访问权限 + content3 (group = site_ops)
- $access = 3 # 访问报告 + content1 (group = site_content1)
- $access = 4 # 访问报告 + content2 (group = site_content2)
- $access = 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;
}
任何帮助将不胜感激!谢谢!
【问题讨论】:
-
如果您的 AD 中有这些组,其中包括成员,那么我认为您的代码就是要走的路。但要确保每个用户与他的组是一对一的关系。
标签: php forms authentication active-directory