2012-09-11 85 views
3

爲同一個域上的Django項目和vBulletin板創建單點登錄(SSO)最簡單的方法是什麼?Django/vBulletin單點登錄

我有一個現有的vBulletin用戶數據庫。我查看了Django的RemoteUserBackend和vBulletin的vBSSO,但我還沒有找到完整的解決方案。

+0

你有沒有想過編寫一個自定義django auth後端? https://docs.djangoproject.com/en/1.3/topics/auth/#other-authentication-sources – JeffS

回答

3

我不知道Django,但是當你達到這樣的目的時,搜索「橋樑」。 有人很可能已經爲你做了這件事。

的信息,這三個來源也可以幫助你通過做你自己橋:

Drupal的橋
http://drupalcode.org/project/drupalvb.git/blob/9b5ab7b93043edfc2fe09c083cc9108344e26577:/drupalvb.inc.php

CakePHP的橋
https://github.com/ceeram/static_bakery/blob/master/src/articles/2010/01/Vbulletin-Bridge-For-CakePHP.rst

通用大橋
http://www.saurdo.com/11/11/utilizing-the-vbulletin-database-in-your-main-site

基本上,您需要查看cookie並匹配vBulletin數據庫中的會話哈希以確保用戶已登錄,然後您可以收集所有用戶信息。

引述第三環節做了Generig橋:

/* 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); } 
} 

我希望它可以幫助你取得一些進展。

+0

謝謝你的回答。我在第三個鏈接([Generic Bridge](http://www.saurdo.com/11/11/utilizing-the-vbulletin))中翻譯了get_session(),get_cookie()和check_login() -database-in-your-main-site))直接導入到Python中,它工作得很好。 –