为同一域上的 Django 项目和 vBulletin 板进行单点登录 (SSO) 的最简单方法是什么?
我有一个现有的 vBulletin 用户数据库。我研究了 Django 的RemoteUserBackend和 vBulletin 的vBSSO,但我还没有找到完整的解决方案。
为同一域上的 Django 项目和 vBulletin 板进行单点登录 (SSO) 的最简单方法是什么?
我有一个现有的 vBulletin 用户数据库。我研究了 Django 的RemoteUserBackend和 vBulletin 的vBSSO,但我还没有找到完整的解决方案。
我不了解 Django,但是当您遇到这样的事情时,请搜索“bridges”。很有可能有人已经为您做到了。
这三个信息来源也可以帮助您完成自己的桥梁:
通用桥
http://www.saurdo.com/11/11/utilizing-the-vbulletin-database-in-your-main-site
基本上,您需要查看 cookie 并匹配 vBulletin DB 中的会话哈希以确保用户已登录,然后您可以收集所有用户信息。
引用做 Generig Bridge 的第三个链接:
/* Check if session exist then return user id*/
function get_session($hash){
dbconnect();
$hash = mysql_real_escape_string($hash);
$ip = implode('.', array_slice(explode('.', $_SERVER['REMOTE_ADDR']), 0, 4 - 1));
$newidhash = md5($_SERVER['HTTP_USER_AGENT'] . $ip);
$query = "SELECT * FROM session WHERE sessionhash = '".$hash."' LIMIT 1";
$result = mysql_query($query);
if(mysql_num_rows($result) > 0){
$row = mysql_fetch_array($result);
$sessionhash = $row['sessionhash'];
$idhash = $row['idhash'];
$userid = $row['userid'];
$lastactive = $row['lastactivity'];
return ($idhash == $newidhash && (time() - $lastactive) < 900) ? $userid : false;
}
return false;
}
检查数据库中的 cookie 值:
function get_cookie($id, $pass){
dbconnect();
$id = mysql_real_escape_string($id);
$query = "SELECT * FROM user WHERE userid = ".$id." LIMIT 1";
$result = mysql_query($query);
if(mysql_num_rows($result) > 0){
$row = mysql_fetch_array($result);
$dbpass = $row['password'];
// vb might change the salt from time to time. can be found in the /includes/functions.php file
if(md5($dbpass . '0d582e0835ec6697262764ae6cb467fb') == $pass){
return $id;
}
}
return false;
}
将其全部包装起来以确定用户是否已登录:
function check_login(){
if(isset($_COOKIE['bb_userid']) && isset($_COOKIE['bb_password'])){
if(get_cookie($_COOKIE['bb_userid'], $_COOKIE['bb_password'])){
return $_COOKIE['bb_userid'];
}
}
if(isset($_COOKIE['bb_sessionhash'])){
if(get_session($_COOKIE['bb_sessionhash'])){
return get_session($_COOKIE['bb_sessionhash']);
}
}
return false;
}
检索要显示的用户信息:
function user_info($id){
dbconnect();
$result = mysql_query("SELECT * FROM user WHERE userid = ".mysql_real_escape_string($id)." LIMIT 1";);
return mysql_fetch_array($result);
}
最后,在某处使用上述功能。像这样:
if($li = check_login()){
dbconnect();
$uinfo = user_info($li);
$q_lastactivity = "UPDATE user SET lastactivity = '".time()."' WHERE userid = ".$li." LIMIT 1";
mysql_query($q_lastactivity);
if((time() - $uinfo['lastactivity']) > 900){
$q_lastvisit = "UPDATE user SET lastvisit = '".$uinfo['lastactivity']."' WHERE userid = ".$li." LIMIT 1";
mysql_query($q_lastvisit); }
}
我希望它可以帮助你取得一些进展。