首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django / vBulletin单点登录

Django / vBulletin单点登录
EN

Stack Overflow用户
提问于 2012-09-11 20:42:47
回答 1查看 1.6K关注 0票数 3

在同一个域中,让Django项目和vBulletin板子实现单点登录最简单的方法是什么?

我有一个现有的vBulletin用户数据库。我已经研究了Django的RemoteUserBackend和vBulletin的vBSSO,但我还没有找到一个完整的解决方案。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-10-10 09:54:08

我不知道Django,但是当你想做这样的事情时,搜索"bridges“。很有可能已经有人为你做了这些。

这三个信息来源也可以帮助你完成自己的桥梁:

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

基本上,您需要查看cookies并匹配来自vBulletin DB的会话散列,以确保用户已登录,然后您可以收集所有用户信息。

引用做Generig桥的第三个链接:

代码语言:javascript
复制
/* 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值:

代码语言:javascript
复制
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;   
}

总结一下,以确定用户是否已登录:

代码语言:javascript
复制
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;
}

检索要显示的用户信息:

代码语言:javascript
复制
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);
}

最后,在某个地方使用上面的函数。如下所示:

代码语言:javascript
复制
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);  }
}

我希望它能帮助你取得一些进步。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12370005

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档