PHP + APACHE + LDAP + SSO: 如何获取当前用户的MemberOf 和DisplayName 属性?
PHP + APACHE + LDAP + SSO: How to get the current user MemberOf and DisplayName attribute?
我有一个 Web 应用程序,当前要求用户在登录页面中填写用户名和密码。我的想法是使用SSO来避免手动输入这些信息。
在修改 httpd.conf 文件几个小时后,我能够让我的 Web 应用程序获得当前 Window 的用户名 $_SERVER['PHP_AUTH_USER'];
命令。
要比较应用程序内部的某些访问权限,不幸的是,我还需要他当前所在的组。在这种情况下,它将是 Active Directory memberOf
属性
考虑到手动登录不会,请问如何获取memberOf
属性?我应该再次询问用户以获取此信息还是有更好的方法?
顺便说一句,我目前正在使用:
- Apache 版本 2.4.33 x64
- PHP 版本 7.2.4 x64
- WAMPServer 版本 3.1.3 x64
- Windows 服务器 2008 x64
只是为了比较,我用来检索组和 DisplayName
属性的当前代码。它运行良好,但是需要手动输入用户名和密码:
public function Login($user, $pass, $remember = false){
require_once("ad.class.php");
$ldap = new Ldap();
$ret = $ldap->Bind($user, $pass);
$redirect = RedirectURL($this->redirect);
if ($ret){
$filter = "(&(sAMAccountName=$user))";
$attributes = array("displayname","samaccountname","memberof");
$info = $ldap->GetEntries($filter, $attributes);
$aGrp = array();
if (count($info) > 0){
foreach ($info[0]['memberof'] as $member) {
$aMember = explode(",", $member);
$grp = str_replace("CN=\", "", $aMember[0]);
$grp = str_replace("CN=", "", $grp);
$aGrp[] = $grp;
}
}
if (!isset($_SESSION)) session_start();
$_SESSION['session_login'] = array();
$_SESSION['session_login']['user'] = $info[0]["samaccountname"][0];
$_SESSION['session_login']['name'] = $info[0]["displayname"][0];
$_SESSION['session_login']['grp'] = $aGrp;
$_SESSION['lang'] = getDefaultLanguage();
if ($remember){
$expire = (time() + (15 * 24 * 3600)); //15 dias
setcookie('cookie_login', $_SESSION['session_login'], $expire);
}
accessLog(getCurrentUser(), 'Authorized - LDAP');
header("Location: index.php?redirect=" . $redirect);
return true;
}else{
$ret['redirect'] = $redirect;
$this->errors = $ret; //$this->redirect
accessLog(getCurrentUser(), 'Access Denied - LDAP');
}
return false;
}
SSO 不会将您(您的用户)从身份验证过程中解放出来,最终他们将不得不这样做,但它可能看起来像。
有几个库可用于各种 SSO,但如果您想在 Web 环境中使用 "real" SSO,SAML2 与 HTTP POST 绑定,您几乎无法绕过simplesaml 库:https://simplesamlphp.org/
我会在任何尝试中推荐这个库,以实现黑客攻击...使用 simplesaml 你可以获得一个 full-featured industry-standard SSO,它可以轻松地与其他身份提供者连接,比如 [上的 ADFS] =22=].
hth
我有一个 Web 应用程序,当前要求用户在登录页面中填写用户名和密码。我的想法是使用SSO来避免手动输入这些信息。
在修改 httpd.conf 文件几个小时后,我能够让我的 Web 应用程序获得当前 Window 的用户名 $_SERVER['PHP_AUTH_USER'];
命令。
要比较应用程序内部的某些访问权限,不幸的是,我还需要他当前所在的组。在这种情况下,它将是 Active Directory memberOf
属性
考虑到手动登录不会,请问如何获取memberOf
属性?我应该再次询问用户以获取此信息还是有更好的方法?
顺便说一句,我目前正在使用:
- Apache 版本 2.4.33 x64
- PHP 版本 7.2.4 x64
- WAMPServer 版本 3.1.3 x64
- Windows 服务器 2008 x64
只是为了比较,我用来检索组和 DisplayName
属性的当前代码。它运行良好,但是需要手动输入用户名和密码:
public function Login($user, $pass, $remember = false){
require_once("ad.class.php");
$ldap = new Ldap();
$ret = $ldap->Bind($user, $pass);
$redirect = RedirectURL($this->redirect);
if ($ret){
$filter = "(&(sAMAccountName=$user))";
$attributes = array("displayname","samaccountname","memberof");
$info = $ldap->GetEntries($filter, $attributes);
$aGrp = array();
if (count($info) > 0){
foreach ($info[0]['memberof'] as $member) {
$aMember = explode(",", $member);
$grp = str_replace("CN=\", "", $aMember[0]);
$grp = str_replace("CN=", "", $grp);
$aGrp[] = $grp;
}
}
if (!isset($_SESSION)) session_start();
$_SESSION['session_login'] = array();
$_SESSION['session_login']['user'] = $info[0]["samaccountname"][0];
$_SESSION['session_login']['name'] = $info[0]["displayname"][0];
$_SESSION['session_login']['grp'] = $aGrp;
$_SESSION['lang'] = getDefaultLanguage();
if ($remember){
$expire = (time() + (15 * 24 * 3600)); //15 dias
setcookie('cookie_login', $_SESSION['session_login'], $expire);
}
accessLog(getCurrentUser(), 'Authorized - LDAP');
header("Location: index.php?redirect=" . $redirect);
return true;
}else{
$ret['redirect'] = $redirect;
$this->errors = $ret; //$this->redirect
accessLog(getCurrentUser(), 'Access Denied - LDAP');
}
return false;
}
SSO 不会将您(您的用户)从身份验证过程中解放出来,最终他们将不得不这样做,但它可能看起来像。
有几个库可用于各种 SSO,但如果您想在 Web 环境中使用 "real" SSO,SAML2 与 HTTP POST 绑定,您几乎无法绕过simplesaml 库:https://simplesamlphp.org/
我会在任何尝试中推荐这个库,以实现黑客攻击...使用 simplesaml 你可以获得一个 full-featured industry-standard SSO,它可以轻松地与其他身份提供者连接,比如 [上的 ADFS] =22=].
hth