免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1842 | 回复: 0
打印 上一主题 下一主题

在PHP中实现单点登录(Single Sign On)的一种简单方法! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-12-08 22:08 |只看该作者 |倒序浏览
以下为原创,转载请注明出处!

作者:Dirk (dirk.ye AT gmail.com)
Url:http://dirk.pdx.cn
日期:2004/12/08


单点登录是大容量系统必备的功能,市面上有几款昂贵的商业系统,若不是财大气粗,恐怕用不起。
怎么样才能简单、经济的实现这个功能?我们在这里探讨一种可行的方案。

当前开发Web应用中,Apache + PHP + MySQL是中小型企业降低成本的必选架构,这里我们来实现PHP的单点登录,让这种经济性的架构能够扩展到的群集服务器层面。

我们的设想是将PHP的Session数据集中存储,这样对于不同服务器中运行的PHP来说,只有一个共有的Session数据库,那么用户在服务器A登录所生成的Session数据在服务器B、C、D等服务器都可以共享,就可以免除多次登录。但由于PHP的Session是需要Cookie的,而Cookie又是与域名相关的,所以采用这个方案的各个服务器需要有相同的域名(至少是相同的二级域名),比如:
1、所有服务器的域名都是www.whybsd.com,这个东东DNS轮询就可以实现;这个时候,在PHP中将Cookie域名设置为www.whybsd.com即可;
2、所有服务器的域名都是以.whybsd.com结尾的三级域名,比如a.whybsd.com,b.whybsd.com等等,这个时候,在PHP中将Cookie域名设置为.whybsd.com就可以共享Cookie了。

解决了先决条件,我们现在来看看PHP的Session存储方法,在PHP手册说明中,有一个叫session_set_save_handler()的函数,这个函数是用来注册用户自定义的Session数据存储接口的。

以下是PHP手册自带的示例:


  1. <?php
  2. function open($save_path, $session_name) {
  3.   global $sess_save_path, $sess_session_name;
  4.       
  5.   $sess_save_path = $save_path;
  6.   $sess_session_name = $session_name;
  7.   return(true);
  8. }

  9. function close() {
  10.   return(true);
  11. }

  12. function read($id) {
  13.   global $sess_save_path, $sess_session_name;

  14.   $sess_file = "$sess_save_path/sess_$id";
  15.   if ($fp = @fopen($sess_file, "r")) {
  16.     $sess_data = fread($fp, filesize($sess_file));
  17.     return($sess_data);
  18.   } else {
  19.     return(""); // Must return "" here.
  20.   }
  21. }

  22. function write($id, $sess_data) {
  23.   global $sess_save_path, $sess_session_name;

  24.   $sess_file = "$sess_save_path/sess_$id";
  25.   if ($fp = @fopen($sess_file, "w")) {
  26.     return(fwrite($fp, $sess_data));
  27.   } else {
  28.     return(false);
  29.   }
  30. }

  31. function destroy($id) {
  32.   global $sess_save_path, $sess_session_name;
  33.       
  34.   $sess_file = "$sess_save_path/sess_$id";
  35.   return(@unlink($sess_file));
  36. }

  37. /*********************************************
  38. * WARNING - You will need to implement some *
  39. * sort of garbage collection routine here.  *
  40. *********************************************/
  41. function gc($maxlifetime) {
  42.   return true;
  43. }

  44. session_set_save_handler("open", "close", "read", "write", "destroy", "gc");

  45. session_start();

  46. // proceed to use sessions normally

  47. ?>;
复制代码


按照这种思路,我们只要编写自己的处理函数并进行相应的注册,就可以实现PHP Session数据的自定义存储了。

具体实现可以开动你的思路,比如可以使用NFS将Session数据存储到统一的网络设备中,也可以将Session数据保存到一个数据库中,让所有服务器连接这个共享数据库(比如MySQL)就可以了。

嗯,比较简单,而且经济。

更多考虑:
1、性能需要考量,特别是服务器数(引起资源占用)和用户量(引起Session量)非常巨大的时候。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP