wecenter二次开发系列(三)——多个wc框架同域网站共享cookie
2015-11-03 18:25
603 查看
由于项目需要,我们需要多个二级域名问答网站对整站的内容进行独立管理和运营。
那么,如何实现用户在任何一个子站或主站登入登出统一步调呢?在这里我们首先需要共享cookie,从而实现同域单点登录,统一生成.xxx.com下的cookie,使得主站和子站用生成的cookie进行用户身份校验。
主要涉及三个文件:
system/core/user.php 读取cookie并进行解码
app/account/ajax.php 登录后设置cookie
models/account.php 设置cookie
具体的代码修改分以下几块:
说明:由于不明的原因G_COOKIE_DOMAIN define无效,故设置cookie的时候直接指定域为.xxx.com
说明:二级域名获取cookie必须保证名称一致,另外二级域名在生成cookie的时候同样要指定域为.xxx.com。
代码中注释部分为代码。
改动2:/system/functions.inc.php 将用户登录信息编译成 hash 字符串,用于发送 Cookie
这里的G_COOKIE_HASH_KEY同样需要指定为一级域名的hashkey=’fwtvfmbkzamtjyq’(具体需要调试查看主站的hashkey确定,可能会有变动)
改动3:system/core/user.php 读取cookie并进行解码
说明:G_COOKIE_HASH_KEY如果主站的不一致,必须指定一直,这里为’fwtvfmbkzamtjyq’,另外还需指定cookie名jdn__user_login。
那么,如何实现用户在任何一个子站或主站登入登出统一步调呢?在这里我们首先需要共享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确定
相关文章推荐
- App工程结构搭建:几种常见Android代码架构分析
- 浅谈搜索引擎技术原理与架构
- 构建高并发高可用的电商平台架构实践
- 原生JS判断网站服务器是否开启,如果开启就跳转到网站
- 六.Servlet类的基本架构
- App 开发:Hybrid 架构下的 HTML5 应用加速方案
- 【政府网站普查】政府网站的理想很丰满,现实却很骨感
- Web API应用架构设计分析(2)
- Web API应用架构设计分析(1)
- 架构师知识体系(2)--什么是架构师
- 架构师知识体系(1)--WEB架构师成长之路
- 【架构】小型创业公司的架构布局思考
- PHP网站验证码不显示
- 项目经理 Or 技术架构
- MySQL高可用性大杀器之MHA
- 服务器部署网站遇到的问题
- 一些可以学习的网站
- linux下I2C驱动架构全面分析
- warez世界顶级压缩作品网站
- 技术网站