一、什么是单点登录

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

二、举个例子:

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

你登录淘宝后,你的浏览器得到了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. web API .net - .net core 对比学习-依赖注入

    今天我们来看一下 .net web api 和 .net core web api依赖注入机制的差异. 首先我们分别在.net web api 和 .net core web api新建文件夹Serv ...

  2. Description Resource Path Location Type Unknown Unknown Unknown org.eclipse.core.internal.resources.Marker is not of a displayable type

    是访问限制报错. 方法一: 全局属性Project>preferences>java>Compiler>Errors/Warnings>把右侧的[Deprecated a ...

  3. 心知天气数据API 产品的高并发实践

    心知天气数据API 产品的高并发实践 心知天气作为国内领先的商业气象服务提供商,天气数据API 产品从公司创立以来就一直扮演着很重要的角色.2009 年API 产品初次上线,历经十年,我们不断用心迭代 ...

  4. UIP和lwip的区别 转载

    uIP是专门为8位和16位控制器设计的一个非常小的TCP/IP栈.完全用C编写,因此可移植到各种不同的结构和操作系统上,一个编译过的栈可以在几KB ROM或几百字节RAM中运行.uIP中还包括一个HT ...

  5. 使用Cloudera Manager搭建Hive服务

      使用Cloudera Manager搭建Hive服务 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.安装Hive环境 1>.进入CM服务安装向导 2>.选择需要 ...

  6. SpringCloud组件相关

    一.前言 原文地址:https://mp.weixin.qq.com/s/mwn2X0G9UgUDz1sgGgL1mA 认识我的朋友可能都知道我这阵子去实习啦,去的公司说是用SpringCloud(但 ...

  7. git config user.name

    Setting your username in Git Git uses a username to associate commits with an identity. The Git user ...

  8. ted演讲小总结(持续更新_12月15日)

    目录 2019年12月1日 星期日 2019年12月2日 星期一 2019年12月3日 星期二 2019年12月8日 星期日 2019年12月15日 星期日(这个演讲相对来说不好理解,因为这类逻辑暂时 ...

  9. 零基础如何学好Python 之int 数字整型类型 定义int()范围大小转换

    本文主题是讲python数字类型python int整型使用方法及技巧.它是不可变数据类型中的一种,它的一些性质和字符串是一样的,注意是整型不是整形哦. Python int有多种数字类型:整型int ...

  10. asp、aspx、php、jsp万能密码大全【笔记】

    asp aspx万能密码 1:"or "a"="a 2: ')or('a'='a 3:or 1=1-- 4:'or 1=1-- 5:a'or' 1=1-- 6: ...