wecenter二次开发系列(三)——多个wc框架同域网站共享cookie

来源:互联网 发布:网络上hl是什么意思 编辑:程序博客网 时间:2024/05/16 11:16

由于项目需要,我们需要多个二级域名问答网站对整站的内容进行独立管理和运营。

那么,如何实现用户在任何一个子站或主站登入登出统一步调呢?在这里我们首先需要共享cookie,从而实现同域单点登录,统一生成.xxx.com下的cookie,使得主站和子站用生成的cookie进行用户身份校验。

主要涉及三个文件:
system/core/user.php 读取cookie并进行解码
app/account/ajax.php 登录后设置cookie
models/account.php 设置cookie
具体的代码修改分以下几块:

1.对于主站

改动:设置主站system/class/cls_http.inc.php中setcookie函数$domain为”.xxx.com”。

public static function set_cookie($name, $value = '', $expire = null, $path = '/', $domain = null, $secure = false, $httponly = false)    {        if (! $domain and G_COOKIE_DOMAIN)        {            $domain = G_COOKIE_DOMAIN;        }        $domain = '.xxx.com';        return setcookie('jdn_' . $name, $value, $expire, $path, $domain, $secure, $httponly);        //return setcookie(G_COOKIE_PREFIX . $name, $value, $expire, $path, $domain, $secure, $httponly);    }

说明:由于不明的原因G_COOKIE_DOMAIN define无效,故设置cookie的时候直接指定域为.xxx.com

2.对于子站:

改动1:system/class/cls_http.inc.php

说明:二级域名获取cookie必须保证名称一致,另外二级域名在生成cookie的时候同样要指定域为.xxx.com。

代码中注释部分为代码。

/*** 获取 COOKIE** @param $name*/public static function get_cookie($name){    // if (isset($_COOKIE[G_COOKIE_PREFIX . $name]))    // {        // return $_COOKIE[G_COOKIE_PREFIX . $name];    // }    if (isset($_COOKIE['jdn_' . $name]))    {        return $_COOKIE['jdn_' . $name];    }    return false;}/** * 设置 COOKIE * * @param $name * @param $value * @param $expire * @param $path * @param $domain * @param $secure * @param $httponly */public static function set_cookie($name, $value = '', $expire = null, $path = '/', $domain = null, $secure = false, $httponly = false){    if (! $domain and G_COOKIE_DOMAIN)    {        $domain = G_COOKIE_DOMAIN;    }    $domain = '.f1bang.com';    return setcookie('jdn_' . $name, $value, $expire, $path, $domain, $secure, $httponly);    //return setcookie(G_COOKIE_PREFIX . $name, $value, $expire, $path, $domain, $secure, $httponly);}

改动2:/system/functions.inc.php 将用户登录信息编译成 hash 字符串,用于发送 Cookie

这里的G_COOKIE_HASH_KEY同样需要指定为一级域名的hashkey=’fwtvfmbkzamtjyq’(具体需要调试查看主站的hashkey确定,可能会有变动)

/** * 将用户登录信息编译成 hash 字符串,用于发送 Cookie * * @param  string * @param  string * @param  string * @param  integer * @param  boolean * @return string */function get_login_cookie_hash($user_name, $password, $salt, $uid, $hash_password = true){    if ($hash_password)    {        $password = compile_password($password, $salt);    }    //$auth_hash_key = md5(G_COOKIE_HASH_KEY . $_SERVER['HTTP_USER_AGENT']);    $auth_hash_key = md5('fwtvfmbkzamtjyq' . $_SERVER['HTTP_USER_AGENT']);    return H::encode_hash(array(        'uid' => $uid,        'user_name' => $user_name,        'password' => $password    ), $auth_hash_key);}

改动3:system/core/user.php 读取cookie并进行解码

说明:G_COOKIE_HASH_KEY如果主站的不一致,必须指定一直,这里为’fwtvfmbkzamtjyq’,另外还需指定cookie名jdn__user_login。

public function __construct(){           if (AWS_APP::session()->client_info AND ! $_COOKIE['jdn__user_login'])    {                   unset(AWS_APP::session()->client_info);    }    if (! AWS_APP::session()->client_info AND $_COOKIE['jdn__user_login'])    {        //$auth_hash_key = md5(G_COOKIE_HASH_KEY . $_SERVER['HTTP_USER_AGENT']);        $auth_hash_key = md5('fwtvfmbkzamtjyq' . $_SERVER['HTTP_USER_AGENT']);        // 解码 Cookie        $sso_user_login = H::decode_hash($_COOKIE['jdn__user_login'], $auth_hash_key);             if ($sso_user_login['user_name'] AND $sso_user_login['password'] AND $sso_user_login['uid'])        {                           if (AWS_APP::model('account')->check_hash_login($sso_user_login['user_name'], $sso_user_login['password']))            {                               AWS_APP::session()->client_info['__CLIENT_UID'] = $sso_user_login['uid'];                AWS_APP::session()->client_info['__CLIENT_USER_NAME'] = $sso_user_login['user_name'];                AWS_APP::session()->client_info['__CLIENT_PASSWORD'] = $sso_user_login['password'];                return true;            }        }        return false;    }}

特别注意:这里的‘jdn_’,’fwtvfmbkzamtjyq’可能会发生改变,具体可查看浏览器中cookie确定

0 0
原创粉丝点击