喜悦国际村 
» 游客:  注册 | 登录 | 统计 | 喜悦证交所 | 帮助

RSS 订阅当前论坛  

【北京】--【低薪】-【诚聘】--- 高级PHP工程师,WEB前台开发工程师

上一主题 下一主题
 40  1/4  1  2  3  4  > 
     
标题: passport设计一例  
本帖已经被作者加入个人空间
 
无喱头 (无喱头)
论坛元老
Rank: 8Rank: 8
扯蛋仙


UID 24846
精华 3
积分 5965
帖子 1125
金钱 5901 喜悦币
威望 30
人脉 34
阅读权限 90
注册 2003-11-26
状态 离线
passport设计一例

写得比较粗糙,未打草稿,有不到之处,请原谅。

新单位上班,第一份差事就是几个网站的整合。会员数据大概有120w左右。分别来自不同的数据库,怎么整合这些资源及处理passport问题,着实让我郁闷了好久。经过N根头发的脱落痛苦挣扎之后,终于拟定处理方案。

首先,做会员整合设计。

考虑到百W级的用户库极有可能存在着用户同名的问题,在进行会员整合时拟两种方案:
1.        为不同的表的用户进行改编,新增一个public_user公共用户表,导入所有用户表,取一个重要的用户表为主表,保持会员名称属性不变,其它表用户前加相应标记。如:sky.aboutusername。从而达到避免用户同名问题。
2.        新增一个passport_user表,用户进行login时,首先检查passport_user表,然后进行其它用户表逐表检查,直到遇到此用户为止。然后进行login,同时复制用户信息到passport_user表。

经过分析发现,其实第二种还是避免不了用户同名现象,经过与领导沟通,决定采用第一种方案。

建立public_user表,将所有用户基本数据导入,库设计为 id,username,password,email。为嘛这样设计,在这里不进行述说,因为本文的目的是做多系统passport,整合数据表,只是前奏。

好了,我们的会员数据已经整合完毕了,现在开始讲passport。

Passport有两种情况,一种是系统采用session,一种是cookie,本次进行passport设计,采用的是后一种。

其实说白了,passport当在采用cookie时,原理是很简单的,无非就是为不同的系统产生它所需要的cookie而已。但我们考虑的是,尽量的在不动系统的基础下进行passport,所以最大的难点可能就在于puclib_user 与 不同的系统user进行同步的问题了。

OK,让我们开始时。

系统说说明:本文举例为 phpwind4.3.2论坛与公司内部使用的投票系统。以下简称为pw及vote。目录架构为 : ROOT_PATH/club,ROOT_PATH/vote。

我们已经建好了数据库,表为public_user库,并且确保我们已经将所有会员数据导入。
进行以下几步操作:
在ROOT_PATH目录下建立 public目录,存放公共的passport文件。

书写passport.php文件,在passport.php文件中,我们需要做的工作是为不同来源的文件产生不同的cookies及进行会员数据更新。为什么说到passport会对会员数据更新呢?这是因为我一直坚信进行最小的源系统修改才是整合之道。也就是说,当用户通过不同的系统进行注册时,我们同时在此系统下的USER及public_user表里写数据,当然,public_user表简单了一些,只有username,password,email几个字段。

我们开始模拟用户的整个lgoin过程。
有两种情况:
1.        用户没有在任何地方login
2.        用户在一个系统中进行login

可能会存在着多种系统,但原理是一样的,我这里只讲两个系统实例。多系统你可以考虑做一个array数组来进行映射。

首先,我们确定有一个入口。如在公共的header文件的模板中加入类似于下面的超链接:
<a href=”../public/passport.php?go=club”>论坛</a>
及 <a href=”../public/passport.php?go=vote”>投票系统</a>

或者是写一个passport的页面文件,检测public是否在cookie中存在。如果已经存在,加上上面的地址,否则给login页面

然后我们需要对各个系统间的login.php进行一个修改,修改内容雷同,以pw为例:
打开 login.php,找到:

<?php
Cookie
("winduser",StrCode($winduid."t".$windpwd),$cktime);
Cookie('lastvisit','',0);//将$lastvist清空以将刚注册的会员加入今日到访会员中
?>
两行,在下面加上一行代码:

<?php
Cookie
(‘public’authcode ($pwuser.$windpwd),$cktime);
?>
注:这里的authcode是专为passport文件使用而设计的类似于phpwind中的StrCode

这行代码生成了一个public数据,也就是公共的用户cookie,可以被整个网站的任意系统访问。
同理,你需要在你的其它系统中加入上面一样的代码。

现在public(系统中公共的用户cookie信息)有了,我们还要做两种情况假设:

ok,现在一切都变得那么简单,这种方式的passport.php文件可能如下:

注:我们假设你已经存在了一个公共的passport所需要的所有函数集,这里面的函数,一般仅仅是不同系统中的cookies生成,或者加密方式,一般情况下,我们直接复制相应系统下login所需函即可

<?php
require_once(/pulic/function.php’); 
require_once(
/puclib/global.php’); //此文件中,我们配置了数据库连接及一些公共的信息

$go $_GET[‘go’]; //举例方便,请用户自行过滤
if ( $go =='club'  )
{
    
$cookieUserKey "skyVoteUser"//这里设置你将来产生的cookie keyname
    
$cookies GetCookie($cookieUserKey);
    list(
$username,$pwd) = explode("t",authcode($_COOKIE[$cookieUserKey],"DECODE"));

    
//OK,在这里我们进行一次检测,我们需要检测club用户表里是存存在着
    
extract($db->get_one(“ SELECT count(*) as ‘exits’ FROM `pw_membersWHERE `username` = {$username}’ “));
    if( !
$exits //如果不存在记录,我们加入一条记录进去,当然当你注册public时,一样可以把email注册进去,然后上面的list中读出。
    
{
$db->query(“INSER TINTO …… (‘username’,’password’)  VALUES(‘$username’,$pwd)” );
}

    
$cktime $timestamp+31536000;
    
Cookie("winduser",StrCode($winduid."t".$windpwd),$cktime);
    
Cookie('lastvisit','',0);
    
    
header("Location:../club/index.php");
}

if( 
$go==’vote’ )
{
………………//同样的上面操作
}
?>
在public/function.php文件中,我复制了pw中的cookie操作相应函数:

<?php
……………
.
function 
StrCode($string,$action='ENCODE')
{
    global 
$settings;
……………
}

function 
Cookie($ck_Var,$ck_Value,$ck_Time 'F')
{
    global 
$cookiepath,$cookiedomain,$timestamp;
    
……………
}

function 
GetCookie($Var)
{
    return 
$_COOKIE[$Var];
}
…………….
?>
好了,login已经解决,同进算是解决了,我们做同出。

在public下面建立一个quit.php文件:
quit.php

<?php
foreach ($_COOKIE as $key=>$val)
{
    
Cookie($key,'',0);
}
header("Location:{$_SERVER['HTTP_REFERER']}");
?>
就这么简单。

现在还需要做的是在用户注册时写入public_user同样的数据,里面可以只包含有 username,passrow,email几个字段就OK了,这个步骤基本都很简单,只需要在相应的系统注册程序中加入INSERT INTO public_user…..执行语句就OK了。。。

注:文中所有实例cookie生效及域都在同样下有效。

如果大家感兴趣,下次写个考虑到另外一种情况的passport设计:

假设用户已经logined,但不是从指定入口进入,而是直接输入网址。。。

[ 本帖最后由 无喱头 于 2006-7-31 02:06 PM 编辑 ]




扯吧,一年又一年。。。
2006-7-31 02:02 PM#1
查看资料  Blog  发短消息  顶部
 
sanshi0815 (sanshi0815)
高级会员
Rank: 4
中级会员



UID 63534
精华 1
积分 531
帖子 652
金钱 521 喜悦币
威望 10
人脉 0
阅读权限 50
注册 2005-3-18
状态 离线
[推荐阅读] php如何连接db2数据库
好东西,弄个沙发
2006-7-31 02:04 PM#2
查看资料  Blog  发短消息  QQ  顶部
 
只爱一个人 (只爱一个人)
论坛元老
Rank: 8Rank: 8
超级管理员



UID 29639
精华 0
积分 3812
帖子 1601
金钱 3812 喜悦币
威望 0
人脉 0
阅读权限 90
注册 2004-6-26
状态 离线
[推荐阅读] 请教用AJAX如何控制一个层的开关或者用JS就可以了?
我顶起来,然后一定要倒背如流
2006-7-31 02:26 PM#3
查看资料  访问主页  Blog  发短消息  顶部
 
无喱头 (无喱头)
论坛元老
Rank: 8Rank: 8
扯蛋仙


UID 24846
精华 3
积分 5965
帖子 1125
金钱 5901 喜悦币
威望 30
人脉 34
阅读权限 90
注册 2003-11-26
状态 离线
[推荐阅读] 一个男生写的程序(ZT)
没人喝彩。。。。。晕。。。。



扯吧,一年又一年。。。
2006-7-31 02:27 PM#4
查看资料  Blog  发短消息  顶部
 
andsky (andsky)
注册会员
Rank: 2
一般会员



UID 63241
精华 0
积分 70
帖子 75
金钱 70 喜悦币
威望 0
人脉 0
阅读权限 20
注册 2005-2-18
状态 离线
[推荐阅读] 新配制的php 验证码不能显示
喝彩!






您的帖子长度不符合要求。
2006-7-31 02:30 PM#5
查看资料  访问主页  发短消息  顶部
 
游子云 (努力捡个芝麻)
版主
Rank: 7Rank: 7Rank: 7


UID 12528
精华 2
积分 2922
帖子 3029
金钱 2902 喜悦币
威望 20
人脉 0
阅读权限 100
注册 2002-1-29
来自 杭州
状态 离线
[推荐阅读] 小谈拜金女
写的不错!就是下次能把SESSION在提到就完美了
作为程序员文章写到这样,着实不错了




php 培训欢迎咨询! qq:310172http://www.phpwhy.com
2006-7-31 02:31 PM#6
查看资料  访问主页  Blog  发短消息  QQ  Yahoo!  顶部
 
无喱头 (无喱头)
论坛元老
Rank: 8Rank: 8
扯蛋仙


UID 24846
精华 3
积分 5965
帖子 1125
金钱 5901 喜悦币
威望 30
人脉 34
阅读权限 90
注册 2003-11-26
状态 离线
[推荐阅读] 看陈安之成功学演讲写下的几句~!
ok。下期做 session 及 session+cookie整合 实例吧。。。。

如果有时间,再做不同数据库类型及不同 Script 间的整合。。。

哈哈。最近一直在搞这方面了,,,总结了不少经验,包括不同加密方式的passport也做过。。。

有时间一并放出来。。。




扯吧,一年又一年。。。
2006-7-31 06:35 PM#7
查看资料  Blog  发短消息  顶部
 
qh663
版主
Rank: 7Rank: 7Rank: 7
中级会员


UID 30020
精华 0
积分 546
帖子 580
金钱 546 喜悦币
威望 0
人脉 0
阅读权限 100
注册 2004-7-13
来自 河源
状态 离线
[推荐阅读] 在读生找工作难不难
支持!!!
session比cookie的确安全性高一点。期望…




五百多篇PHP学习资料
喜悦村BLOG
php团队接兼职项目QQ:80031807
PHP群:768844
2006-7-31 06:49 PM#8
查看资料  访问主页  Blog  发短消息  QQ  顶部
 
菜鸟也要有理想
中级会员
Rank: 3Rank: 3
一般会员



UID 65342
精华 0
积分 439
帖子 426
金钱 439 喜悦币
威望 0
人脉 0
阅读权限 30
注册 2005-8-1
状态 离线
[推荐阅读] 奇怪的session问题~
先顶再看
2006-8-1 12:32 AM#9
查看资料  发短消息  顶部
 
菜鸟也要有理想
中级会员
Rank: 3Rank: 3
一般会员



UID 65342
精华 0
积分 439
帖子 426
金钱 439 喜悦币
威望 0
人脉 0
阅读权限 30
注册 2005-8-1
状态 离线
[推荐阅读] 征一情人
像网易那样是怎么做地呀
多域名跨站
2006-8-1 12:35 AM#10
查看资料  发短消息  顶部
 40  1/4  1  2  3  4  > 
     


  可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题 | 开通个人空间  


 


Powered by Discuz! 6.1.0  © 2001-2010 Comsenz Inc.
Processed in 0.028898 second(s), 6 queries

(冀ICP备05009913号) 管理员:sadly 邮箱/MSN: sadly@phpx.com QQ:824008(长隐) 清除 Cookies - - Archiver - WAP