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确定
- wecenter二次开发系列(三)——多个wc框架同域网站共享cookie
- wecenter二次开发系列(一)——使用excel插件批量导入去重的bug
- wecenter二次开发系列(二)——提问去重功能
- 不同域下的cookie不共享,必须在同个顶级域下设置cookie
- cookie设置多个应用共享
- PHP实现同服务器多个二级域名共享 SESSION 数据
- 知识共享平台(JAVA)/UCenter/WeCenter 用户数据对接与单点登录
- 客户端禁用cookie,怎样实现session共享多个页面
- Cad二次开发(三)
- thinkphp 同服务器下 二级域名 共享 session cookie
- Java中的cookie(2)——cookie共享
- 跨域共享Cookie
- cookie跨域共享
- Cookie跨域共享
- 跨域共享cookie
- 跨域共享cookie
- 跨域获取cookie,多个网站实现一键登录
- 跨域获取cookie,多个网站实现一键…
- mybatis 返回map 一个项目使用另一个项目表中的三列数据
- iOS推送证书的生成
- HttpClient教程 基本原理
- jsp四大内置对象
- Ajax异步登录判断用户名密码的合法性
- wecenter二次开发系列(三)——多个wc框架同域网站共享cookie
- FFmpeg在iOS上完美编译
- [python 补充] _winreg
- 设置label.text的行间距
- 字符串相似度算法
- java this和super关键字
- linux 下安装ftp服务器
- Lucene4.4与IKAnalyzer冲突
- C语言数据类型范围