一、什么是单点登录

解释:登录一个系统后,其它系统无需再次登录,即可进入。

二、举个例子:

你登录了淘宝,然后你进入天猫,发现你不用登录了。这时你要注意到,淘宝跟天猫可是完全不一样的域名。

你登录淘宝后,你的浏览器得到了cookie,但是这个cookie是在淘宝域名下的。你的天猫域名下并没有cookie。

这个时候你要想办法让天猫域名下也有这个相同的cookie。假设你的天猫域名下也有这个cookie。

当你的浏览器进入天猫时,你的浏览器会携带天猫域名下的cookie去服务器验证。

但是这个cookie对应的可是淘宝域名下的session数据,这个时候又该如何呢。

从这个例子中引出两个问题:

1、跨域种cookie

2、服务端保持cookie对应的session数据是一样的

三、解决思路

四、示例代码

A域名下的 index.php 文件

<?php
header("Content-type: text/html; charset=utf-8"); if(!empty($_POST)) {
$response = curl_post('http://www.U.com/index.php',$_POST);
if($response['code'] > 0) {
die('error:'.$response['msg']);
} set_cookie('SID',$response['data']['sid'],0,'/','',0,1);
echo '登录成功';
$url = 'http://www.B.com/setcookie.php?sid='.$response['data']['sid'];
die('<script type="text/javascript" src="'.$url.'" reload="1"></script>'); } function curl_post( $url , $arrPost = array() , $func = "http_build_query" ){
$ch = curl_init(); $opt[CURLOPT_URL] = $url;
$opt[CURLOPT_RETURNTRANSFER] = 1;
$opt[CURLOPT_TIMEOUT] = 10;
if( !empty( $arrPost ) ){
if( $func == 'json_encode' )
$opt[CURLOPT_HTTPHEADER] = array("Content-Type: application/json;charset=UTF-8");
$opt[CURLOPT_POST] = 1;
$opt[CURLOPT_POSTFIELDS] = call_user_func( $func , $arrPost );
} curl_setopt_array ( $ch, $opt );
$response = curl_exec( $ch );
curl_close( $ch ); return json_decode($response, true);
}
/**
* 免刷新写入cookie
* name 必需。规定 cookie 的名称。
* value 必需。规定 cookie 的值。
* expire 必需。规定 cookie 的有效期。
* path 可选。规定 cookie 的服务器路径。
* domain 可选。规定 cookie 的域名。
* secure 可选。规定是否通过安全的 HTTPS 连接来传输 cookie。
* httponly 可选。规定是否禁止js读取cookie。
*/
function set_cookie($name,$value='',$expire=0,$path='/',$domain='',$secure=0,$httponly=0) {
$_COOKIE[$name] = $value;
if(is_array($value)){
foreach($value as $k=>$v){
if(is_array($v)){
foreach($v as $a=>$b){
setcookie($name.'['.$k.']['.$a.']',$b,$expire,$path,$domain,$secure,$httponly);
}
}else{
setcookie($name.'['.$k.']',$v,$expire,$path,$domain,$secure,$httponly);
}
}
}else{
setcookie($name,$value,$expire,$path,$domain,$secure,$httponly);
}
}
?>
<!DOCTYPE HTML>
<html>
<head>
<title>A域名的登录框</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
<form action="http://www.A.com/index.php" method="post">
<input type="text" name="uname" placeholder="帐号"/>
<input type="password" name="upasswd" placeholder="密码"/>
<input type="submit" value="提交" />
</form>
</body>
</html>

B域名下的 index.php 文件

<?php
header("Content-type: text/html; charset=utf-8");
$sid = isset($_COOKIE['SID']) ? $_COOKIE['SID'] : ''; if(empty($sid)) echo "请先登录"; $response = curl_post('http://www.U.com/index.php',array('sid'=>$sid));
if($response['code'] > 0) {
die('error:'.$response['msg']);
} die('您的帐号密码是:'.$response['data']['uinfo']); function curl_post( $url , $arrPost = array() , $func = "http_build_query" ){
$ch = curl_init(); $opt[CURLOPT_URL] = $url;
$opt[CURLOPT_RETURNTRANSFER] = 1;
$opt[CURLOPT_TIMEOUT] = 10;
if( !empty( $arrPost ) ){
if( $func == 'json_encode' )
$opt[CURLOPT_HTTPHEADER] = array("Content-Type: application/json;charset=UTF-8");
$opt[CURLOPT_POST] = 1;
$opt[CURLOPT_POSTFIELDS] = call_user_func( $func , $arrPost );
} curl_setopt_array ( $ch, $opt );
$response = curl_exec( $ch );
curl_close( $ch ); return json_decode($response, true);
}

B域名下的 setcookie.php 文件

<?php
header("Content-type: text/html; charset=utf-8");
$sid = isset($_GET['sid']) ? $_GET['sid'] : ''; if(!empty($sid)) {
set_cookie('SID',$sid,0,'/','',0,1);
} /**
* 免刷新写入cookie
* name 必需。规定 cookie 的名称。
* value 必需。规定 cookie 的值。
* expire 必需。规定 cookie 的有效期。
* path 可选。规定 cookie 的服务器路径。
* domain 可选。规定 cookie 的域名。
* secure 可选。规定是否通过安全的 HTTPS 连接来传输 cookie。
* httponly 可选。规定是否禁止js读取cookie。
*/
function set_cookie($name,$value='',$expire=0,$path='/',$domain='',$secure=0,$httponly=0) {
$_COOKIE[$name] = $value;
if(is_array($value)){
foreach($value as $k=>$v){
if(is_array($v)){
foreach($v as $a=>$b){
setcookie($name.'['.$k.']['.$a.']',$b,$expire,$path,$domain,$secure,$httponly);
}
}else{
setcookie($name.'['.$k.']',$v,$expire,$path,$domain,$secure,$httponly);
}
}
}else{
setcookie($name,$value,$expire,$path,$domain,$secure,$httponly);
}
}

U域名下的 index.php 文件

<?php
header("Content-type: text/html; charset=utf-8"); $sid = isset($_POST['sid']) ? $_POST['sid'] : '';
if(!empty($sid)) {
$uname_upasswd = file_get_contents($sid);
if(empty($uname_upasswd)) {
die(json_encode(array(
'code'=>1,
'msg'=>'fail',
'data'=>array()
)));
}
die(json_encode(array(
'code'=>0,
'msg'=>'success',
'data'=>array('uinfo'=>$uname_upasswd)
)));
} $uname = isset($_POST['uname']) ? $_POST['uname'] : '';
$upasswd = isset($_POST['upasswd']) ? $_POST['upasswd'] : '';
if($uname == '' || $upasswd == '') {
die(json_encode(array(
'code'=>1,
'msg'=>'fail',
'data'=>array()
)));
} define('SID_SALT', '密码盐'); $passwd = passwd($uname.$upasswd,SID_SALT);
file_put_contents($passwd, $uname.','.$upasswd); die(json_encode(array(
'code'=>0,
'msg'=>'success',
'data'=>array('sid'=>$passwd)
))); function passwd($string,$salt) {
return md5(substr(md5($string).md5($salt),16,48));
}

验证流程:

1、进入A域名,输入帐号密码点击登录。

2、进入B域名,此时会打印出你在A域名输入的帐号密码。

注意:这只是一个简单的验证,实际开发中需要做cookie加密,实效验证等。而且,其实单点登录问题,还有其他解决思路。

php单点登录SSO(Single Sign On)的解决思路的更多相关文章

  1. java:sso(单点登录(single sign on),jsp文件动静态导入方式,session跨域)

    1.jsp文件导入: 2.session跨域: 3.sso(单点登录(single sign on): sso Maven Webapp: LoginController.java: package ...

  2. 单点登录(Single Sign On)解决方案

    单点登录(Single Sign On)解决方案 需求 多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统. A 网站和 B 网站是同一家公司的关联服务.现在要求,用户只要在其中一个网 ...

  3. 自己动手搭建 CAS(Central Authentication Service) 环境,为了单点登录(Single Sign On , 简称 SSO )

    介绍 刚刚搭建 CAS 成功了,现在记录下来,怕以后忘记,同时也给需要帮助的人.CAS 搭建需要服务端和客户端,服务端是 Java 写的,如果自己搭建则需要安装与配置 Java 环境.客户端可以是多种 ...

  4. .NET基于Redis缓存实现单点登录SSO的解决方案[转]

    一.基本概念 最近公司的多个业务系统要统一整合使用同一个登录,这就是我们耳熟能详的单点登录,现在就NET基于Redis缓存实现单点登录做一个简单的分享. 单点登录(Single Sign On),简称 ...

  5. 单点登录SSO

    转载自 http://www.blogjava.net/xcp/archive/2010/04/13/318125.html   摘要:单点登录(SSO)的技术被越来越广泛地运用到各个领域的软件系统当 ...

  6. .NET基于Redis缓存实现单点登录SSO的解决方案

    一.基本概念 最近公司的多个业务系统要统一整合使用同一个登录,这就是我们耳熟能详的单点登录,现在就NET基于Redis缓存实现单点登录做一个简单的分享. 单点登录(Single Sign On),简称 ...

  7. 十六、【适合中小企业的.Net轻量级开源框架】EnterpriseFrameWork框架核心类库之单点登录SSO

    回<[开源]EnterpriseFrameWork框架系列文章索引> EFW框架源代码下载:http://pan.baidu.com/s/1qWJjo3U 单点登录(Single Sign ...

  8. Redis缓存实现单点登录SSO

    .NET基于Redis缓存实现单点登录SSO的解决方案 .NET基于Redis缓存实现单点登录SSO的解决方案   一.基本概念 最近公司的多个业务系统要统一整合使用同一个登录,这就是我们耳熟能详的单 ...

  9. 《浅谈架构之路:单点登录 SSO》

    前言:SSO 单点登录 “半吊子”的全栈工程师又来了,技术类的文章才发表了两篇,本来想先将主攻的几个系列都开个头(Nodejs.Java.前端.架构.全栈等等),无奈博客起步太晚,写博文的时间又没有很 ...

随机推荐

  1. 提高QPS

    常用方案 1.异步化+MQ 即非阻塞,化繁为简,拿到你需要处理的资源后尽快回复.适用于事务处理场景,且无需对上游返回数据场景. 2.无锁设计 本质上是要降低锁冲突,基于数据版本的乐观锁 有效的减少了互 ...

  2. Winmanager,NERDTree和MiniBufExplorer

    NERDTree树形浏览文件 MiniBufExplorer多文件同时编辑 Winmanager将NERDTree和MiniBufExplorer界面整合 下载 http://www.vim.org/ ...

  3. 如何在Hybris commerce里创建一个media对象

    进入backoffice的Media中心, 首先新建一个文件夹,用于存放即将创建的media对象: 取名为jerryimage: 然后创建一个新的media对象,取名jerryproductimage ...

  4. MaxScale ERROR 2006 (HY000): MySQL server has gone away

    Error: MaxScale cannot be run as root.Failed to write child process message!解决办法:# maxscale -f /etc/ ...

  5. visual studio 应用场景

  6. python接口自动化18-multipart/form-data上传多个附件

    前言 reuqests上传一张图片到服务器,前面已经介绍过了,那么如何在提交BUG的时候,上传附件呢? 上传附件的时候,文件的name参数名称是一样的,python里面key是不可以重复的,又如何处理 ...

  7. systemd_journal_no_entries问题解决

    问题: #journalctl Journal file /var/log/journal/410/system@0.journal~ uses an unsupported feature, ign ...

  8. Android AIDL使用详解_Android IPC 机制详解

    一.概述 AIDL 意思即 Android Interface Definition Language,翻译过来就是Android接口定义语言,是用于定义服务器和客户端通信接口的一种描述语言,可以拿来 ...

  9. html实战

    主要html源码 <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset=&qu ...

  10. 给定数字N,输出小于10^N的所有整数

    讲起来比较简单,从0到N遍历输出就行了,但是如果N非常大,就涉及整数溢出问题,很明显是一个全排列问题,也就是输出N,代表N位上所有的数字取值是0-9,做一个全排列,还需要考虑的就是对于0001,006 ...