原来使用PHP LDAP库进行认证,要求服务器和LDAP服务器在同一个内网才能连接。且校园网络为 教育网 内网。
原先将该系统服务器放置在内网服务器时,由于教育网问题,微信及其它网络运营商的用户无法直接访问导致大量用户被屏蔽。且现在面临将该系统放到微信上去用的需求,因此将系统迁移到外网环境。
外网环境下没法使用LDAP直连,准备了三套方案:
1、在一台有外网IP的内网机子上做端口映射,将389端口映射到LDAP服务器的389端口 2、做反向VPN隧道,即内网机器通过VPN链接到外网服务器,通过内网机器来链接LDAP 3、用CURL将学生验证从LDAP切换到学生教务系统
方案1:Windows 下的端口转发
>netsh interface portproxy add v4tov4 389 202.115.160.72 389
LDAP链接
$re = true;
$ldap_ip = 'IP被隐藏了';
$ldap_port=389;
$ldap_user='用户名被隐藏了';
$ldap_pwd='密码被隐藏了';
$ldap_conn = ldap_connect($ldap_ip,$ldap_port);
ldap_bind($ldap_conn,$ldap_user,$ldap_pwd);
$dn = 'o=西南科技大学,dc=swust,dc=edu,dc=cn';
$rs = ldap_search($ldap_conn,$dn,'(uid='.$UID.')');
$ls= ldap_get_entries($ldap_conn,$rs);
if($ls['count']==0){
echo "用户名或密码错误";
$re=false;
}
$pwd = $ls[0]['userpassword'][0];
if(!$this->ssha_check($Password,$pwd)){
echo "用户名或密码错误";
$re=false;
}
ldap_unbind($ldap_conn);
return $re;
结果:失败 原因:外网链接该LDAP转发服务器不稳定,教育网出口不稳定
方案2: 开个虚拟机,在虚拟机里面用VPN链接到外网服务器,外网无法直接连接LDAP服务器,虚拟机无法PING通LDAP服务器。 结果:失败 原因:网络
方案3: 分析教务系统学生登陆请求,用CURL模拟请求实现用户验证: 教务处地址:西南科技大学学生教务处地址
提供CURL封装函数:
function http($url, $param, $data = '', $method = 'GET'){
$opts = array(
CURLOPT_TIMEOUT => 30,
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_SSL_VERIFYHOST => false,
);
/* 根据请求类型设置特定参数 */
$opts[CURLOPT_URL] = $url . '?' . http_build_query($param);
if(strtoupper($method) == 'POST'){
$opts[CURLOPT_POST] = 1;
$opts[CURLOPT_POSTFIELDS] = $data;
if(is_string($data)){ //发送JSON数据
$opts[CURLOPT_HTTPHEADER] = array(
'Content-Type: application/json; charset=utf-8',
'Content-Length: ' . strlen($data),
);
}
}
/* 初始化并执行curl请求 */
$ch = curl_init();
curl_setopt_array($ch, $opts);
$data = curl_exec($ch);
$error = curl_error($ch);
curl_close($ch);
//发生错误,抛出异常
if($error) return false;;
return $data;
}
登陆验证代码
$html = $this->http('https://ids-swust.fayea.com/cas/login','',['lt'=>'LT-C439184B-D9A0-8824-399D31945DC21C39','username'=>$UID,'password'=>$Password,'service'=>'https://matrix.dean.swust.edu.cn/acadmicManager/index.cfm?event=studentPortal:DEFAULT_EVENT'],'POST');
if(strpos($html,'Login Success!')>0){
return true;
}else{
return false;
}
结果:成功
附:调查系统链接