一、什么是单点登录

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

二、举个例子:

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

你登录淘宝后,你的浏览器得到了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. 7.1 为什么bulk使用奇特的json格式?

    回顾: bulk的语法要求:每个json串都不能换行,不同json串之间,必须换行   为什么不用标准json数组呢?如: [     {         "create":{.. ...

  2. XML 约束

    XML约束 一.约束 约束:规定 xml 文档的书写规则 要求: 1.能够在 xml 中引入约束文档 2.能够简单的读懂约束文档 分类: 1.DTD:一种简单的约束技术(后缀.dtd) 2.Schem ...

  3. PS1变量设置

    \d :代表日期,格式为weekday month date \H :完整的主机名 \h :主机的第一个名字 \t :显示时间为24小时格式(HH:MM:SS) \T :显示时间为12小时格式 \A ...

  4. 广联达C++面经(一站式西安) - 2019秋招

    9月7号通知在广联达西安面试,早上在高新面完中兴一面就赶忙坐地铁倒公交去面试了.  一面(大概30-40min) 刚去签了一个到,就带我去面试了,在一个小型会议室,面试我的是一个女面试官(第一次碰见女 ...

  5. 阿里P7整理20个非常有用的Java程序片段,你知道吗?

    1.字符串有整型的相互转换 String a = String.valueOf(2);  //integer to numeric string   int i = Integer.parseInt( ...

  6. 过滤器实现Token验证(登录验证+过期验证)---简单的实现

    功能:登录验证+过期验证+注销清除cookie+未注销下关闭或刷新浏览器仍可直接访问action概述:token只存在客户端cookie,后端AES加密+解密+验证,每一次成功访问action都会刷新 ...

  7. 初识面向对象(钻石继承,super,多态,封装,method,property,classmethod,staticmethod)

    组合 什么有什么的关系 一个类的对象作为另一个类的对象继承 子类可以使用父类中的名字(静态属性 方法)抽象类和接口类 只能不继承,不能被实例化 子类必须实现父类中的同名方法———规范代码 metacl ...

  8. Debian9.5系统安装

    1.镜像下载地址 http://cdimage.debian.org/cdimage/archive/ 2.开始安装 如果有配置网络地址,可以手动配置或者跳过等系统安装好后配置.  至此debian9 ...

  9. Linux命令——getconf

    转自:灵活使用getconf命令来获取系统信息 简介 getconf本身是个ELF可执行文件,用于获取系统信息 用法 getconf -a可以获取全部系统信息 对于这个命令,记住几个常用的信息获取方法 ...

  10. 使用Cloudera Manager搭建YARN集群及YARN HA

    使用Cloudera Manager搭建YARN集群及YARN HA 作者:尹正杰  版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.使用Cloudera Manager搭建YARN集群 1& ...