跨子域实现单点登陆

PHP学习笔记之跨子域实现单点登陆

所谓跨子域实现
比如A 站点为www.nc.com, B 站点为mail.nc.com,认证中心站点 C为 passport.nc.com。从三个站点的关系可以看出,他们都属于同一个二级域 nc.com,不同的是子域不同.Cookie 本身是不能跨域的,即 A, B 站点读不到C 站点写的 cookie 信息,解决办法很简单,将 cookie 的 domain 属性设置为二级域即Cookie. domain=".nc.com",那么 C 写的 cookie 信息 A, B都能读到。当认证中心产生票据时,以 Cookie 的方式存于浏览器端,A,B都能通过 Cookie 得到票据,可简单实现单点登录机制。

跨子域设计

登陆过程
当用户通过客户端访问A站, A站会根据COOKIE名称取得$_SESSION['login']内容, 通过判断此变量是否存在来确定用户是否登陆,如果$_SESSION['login']为空,则说明
用户没有登陆, 那么自动跳转到C站进行登陆, 并带有一个参数URL.通过这个参数可以在登陆后, 自动跳转会原来的A站. 在C站登陆后, 保存$_SESSION['login']为1,
并根据原来传入URL参数, 跳回到原来的A站. A站根据$_SESSION['login']判断已经登陆, 从而显示正常内容.

退出过程
当用户点击退出链接,会自动跳转到C站点也同时带来 URL参数, C站点会注销$_SESSION['login']为空值, 完成注销后自动跳转会A站.

实现过程:
一是用户资料共享
二是共享客户端的 SESSION ID
三是共享服务器端的 SESSION 数据

差异情况
当子域在虚拟主机的时候, 只需要把cookie 的 domain 属性设置为二级域,不需要共享服务器SESSION数据. 因为SESSION就是以文件的方式保存在一台服务器上.
各个子域都可以正常访问同一个SESSION存放文件.从而得到SESSION数据.

当子域在不同的服务器的时候, 除了把cookie 的 domain 属性设置为二级域,还需要共享服务器SESSION数据.可以数据库或其他方式, 这样才能让服务器能访问公共的SESSION数据库取得公共的SESSION数据.


具体实现描述

如何实现用户资料共享呢?
建立一套独立的用户认证系统, 当检查用户在其中一台服务器检测没有登陆,则跳转到用户认证系统. 通过验证后再跳回原来需要登陆的服务器.

如何共享客户端的 SESSION ID?
通过设置Cookie的作用域的值为同一个域名.代码如下:


ini_set
("session.cookie_domain", ".xxx.com");




如何共享服务器端的 SESSION 数据
通过不同的保存方式来实现, 我之前的写"PHP学习笔记之Session保存方式篇"提到了不同的保存方式.以数据库保存为例说明:
代码如下:
统一的接口. session接口. 保存此接口为interface_session.php.
以下代码都经过测试, 都能正常使用. 可以直接在项目中使用


使用:
按你的实际需要修改数据库服务器地址和端口, 在需要Session的文件最开始处, 直接包含此database_session.php文件.
这样三台服务器都可以保存Session到统一的数据库上.当用户在其中一台服务器登陆后, 在其他两台服务器则不需要再重新登陆
现在用上面的代码来实际地验证上面的理论. 以下例子在本地设置虚拟主机的方式实现. 转移到各个独立的服务器理论上是通行

以上面的公司业务作例:
web服务器:http://web.nc.com
邮件服务器:http://mail.nc.com
图片服务器:http://picture.nc.com
认证服务器:http://passport.nc.com

测试软件包下载:
tutorial_sso_1.0.rar


1. 用户共享
通过user类来实现用户认证.此类包含在sso.rar

2.Session ID 共享和Session信息共享
通过Session接口和DatabaseSession类来实现.此类包含在sso.rar

3.实现方式

 1.安装wamp

2.解压sso.rar软件包,放在www/目录下.结构如下
 /sso
/web
/mail
/picture
/passport


3.设置C:/windows/system32/drivers/etc/hosts.增加


127.0.0.1   http
://web.nc.com
   
127.0.0.1   http:
//mail.nc.com
   
127.0.0.1   http:
//picture.nc.com
   
127.0.0.1   http://passort.nc.com



4.设置虚拟主机C:/wamp/bin/apache/apache2.2.6/conf/extra/httpd-vhosts.conf.增加
 


 
<VirtualHost *:80>
    
ServerAdmin ncnynl@gmail.
com
     DocumentRoot
"c:/wamp/www/sso/web"
    
ServerName web.nc.
com
</VirtualHost
>

<
VirtualHost *:80
>
    
ServerAdmin ncnynl@gmail.
com
     DocumentRoot
"c:/wamp/www/sso/mail"
    
ServerName mail.nc.
com
</VirtualHost
>

<
VirtualHost *:80
>
    
ServerAdmin ncnynl@gmail.
com
     DocumentRoot
"c:/wamp/www/sso/picture"
    
ServerName picture.nc.
com
</VirtualHost
>

<
VirtualHost *:80
>
    
ServerAdmin ncnynl@gmail.
com
     DocumentRoot
"c:/wamp/www/sso/passort"
    
ServerName passort.nc.
com
</VirtualHost>


5.建立数据库interview


CREATE DATABASE interview
;



6.建立用户表


  CREATE TABLE
`user` (
   `
uid` int(10) unsigned NOT NULL auto_increment
,
   `
uname` varchar(100) default NULL
,
   `
pass` varchar(32) default NULL
,
  
PRIMARY KEY  (`uid
`),
  
KEY `unamepass` (`uname`,`pass
`)
  ) ENGINE=MyISAM


  7.Session表


CREATE TABLE
`session` (
`
session_id`      varchar(32)          NOT NULL
,
`
session_data`    text                  NOT NULL  default ''
,
`
session_updated` int(10)     unsigned NOT NULL  default '0'
,
PRIMARY KEY (`session_id
`),
  
KEY (`session_updated
`)
)
TYPE=MyISAM;  


8.设置user.php中Passport类,$dsn, $user, $pass
9.设置DatabaseSession类,DATABASE_DSN,DATABASE_USER, DATABASE_PASS
10.当你访问http://web.nc.com, 会跳转到http://passport.nc.com, 第一次需要增加用户,输入用户和密码.选择增加用户.
成功登陆后会自动跳转到http://web.nc.com. 则在访问其他http://picture.nc.com, http://mail.nc.com均显示已经登陆
  在其中一个站点登出,则其他站点同时登出.

from:http://www.ncnynl.com/xoops2016u/modules/article/view.article.php?115/c9

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值