php的sso单点登录实现方法


Posted in PHP onJanuary 08, 2015

本文实例讲述了php的sso单点登录实现方法。分享给大家供大家参考。具体分析如下:

这里详细讲到了几点:
1、点击登录跳转到SSO登录页面并带上当前应用的callback地址
2、登录成功后生成COOKIE并将COOKIE传给callback地址
3、callback地址接收SSO的COOKIE并设置在当前域下再跳回到应用1即完成登录
4、再在应用程序需要登录的地方嵌入一个iframe用来实时检测登录状态,代码如下:
index.php 应用程序页面:

<?php  

header('Content-Type:text/html; charset=utf-8');  

$sso_address = 'http://XXXX.com/sso/login.php'; //你SSO所在的域名  

$callback_address = 'http://'.$_SERVER['HTTP_HOST']  

                    .str_replace('index.php','',$_SERVER['SCRIPT_NAME'])  

                    .'callback.php'; //callback地址用于回调设置cookie 

 

if(isset($_COOKIE['sign'])){  

    exit("欢迎您{$_COOKIE['sign']} <a href="login.php?logout">退出</a>");  

}else{  

    echo '您还未登录 <a href="'.$sso_address.'?callback='.$callback_address.'">点此登录</a>';  

}  

?> 

<iframe src="<?php echo $sso_address ?>?callback=<?php echo $callback_address ?>" frameborder="0"  width="0" height="0"></iframe>

login.php SSO登录页面:
<?php  

header('Content-Type:text/html; charset=utf-8');  

if(isset($_GET['logout'])){  

    setcookie('sign','',-300);  

    unset($_GET['logout']);  

    header('location:index.php');  

} 

 

if(isset($_POST['username']) && isset($_POST['password'])){  

    setcookie('sign',$_POST['username'],0,'');  

    header("location:".$_POST['callback']."?sign={$_POST['username']}");  

} 

 

if(emptyempty($_COOKIE['sign'])){  

?> 

 

<form method="post">  

<p>用户名:<input type="text" name="username" /></p>  

<p>密  码:<input type="password" name="password" /></p>  

<input type="hidden" name="callback" value="<?php echo $_GET['callback']; ?>" />  

<input type="submit" value="登录" />  

</form> 

 

 

<?php  

}else{  

    $query = http_build_query($_COOKIE);  

    echo "系统检测到您已登录 {$_COOKIE['sign']} <a href="{$_GET['callback']}?{$query}">授权</a> <a href="?logout">退出</a>";  

}  

?>

callback.php 回调页面用来设置跨域COOKIE:
<?php  

header('Content-Type:text/html; charset=utf-8');  

if(emptyempty($_GET)){  

    exit('您还未登录');  

}else{  

    foreach($_GET as $key=>$val){  

        setcookie($key,$val,0,'');  

    }  

    header("location:index.php");  

} 

?>

connect.php 用来检测登录状态的页面,内嵌在页面的iframe中:
<?php

header('Content-Type:text/html; charset=utf-8');  

if(isset($_COOKIE['sign'])){  

    $callback = urldecode($_GET['callback']);unset($_GET['callback']);  

    $query = http_build_query($_COOKIE);  

    $callback = $callback."?{$query}";  

}else{

    exit;  

}  

?> 

<html><script type="text/javascript">top.location.href="<?php echo $callback; ?>";</script></html>

希望本文所述对大家的php程序设计有所帮助。

PHP 相关文章推荐
CURL状态码列表(详细)
Jun 27 PHP
php求正负数数组中连续元素最大值示例
Apr 11 PHP
php中ob_get_length缓冲与获取缓冲长度实例
Nov 20 PHP
浅谈json_encode用法
Mar 05 PHP
一个完整的php文件上传类实例讲解
Oct 27 PHP
Symfony2框架学习笔记之表单用法详解
Mar 18 PHP
symfony2.4的twig中date用法分析
Mar 18 PHP
PHP简单实现无限级分类的方法
May 13 PHP
动态表单验证的操作方法和TP框架里面的ajax表单验证
Jul 19 PHP
PHP mongodb操作类定义与用法示例【适合mongodb2.x和mongodb3.x】
Jun 16 PHP
在Laravel中实现使用AJAX动态刷新部分页面
Oct 15 PHP
PHP 图片处理
Sep 16 PHP
PHP制作万年历
Jan 07 #PHP
CI框架中通过hook的方式实现简单的权限控制
Jan 07 #PHP
CI框架中site_url()和base_url()的区别
Jan 07 #PHP
给ECShop添加最新评论
Jan 07 #PHP
php程序总是提示验证码输入有误解决方案
Jan 07 #PHP
WampServer下安装多个版本的PHP、mysql、apache图文教程
Jan 07 #PHP
php中的动态调用实例分析
Jan 07 #PHP
You might like
一个用于MySQL的PHP XML类
2006/10/09 PHP
PHP性能优化 产生高度优化代码
2011/07/22 PHP
php中计算未知长度的字符串哪个字符出现的次数最多的代码
2012/08/14 PHP
PHP字符串的递增和递减示例介绍
2014/02/11 PHP
ThinkPHP查询语句与关联查询用法实例
2014/11/01 PHP
Yii实现自动加载类地图的方法
2015/04/01 PHP
最新最全PHP生成制作验证码代码详解(推荐)
2016/06/12 PHP
PHP的RSA加密解密方法以及开发接口使用
2018/02/11 PHP
js实现同一个页面多个渐变效果的方法
2015/04/10 Javascript
jQuery移动页面开发中的触摸事件与虚拟鼠标事件简介
2015/12/03 Javascript
ionic实现滑动的三种方式
2016/08/27 Javascript
javascript中闭包概念与用法深入理解
2016/12/15 Javascript
js制作可以延时消失的菜单
2017/01/13 Javascript
详解Angular 自定义结构指令
2017/06/21 Javascript
node+koa实现数据mock接口的方法
2017/09/20 Javascript
vue解决一个方法同时发送多个请求的问题
2018/09/25 Javascript
微信小程序使用component自定义toast弹窗效果
2018/11/27 Javascript
vue cli 3.x 项目部署到 github pages的方法
2019/04/17 Javascript
了解Javascript中函数作为对象的魅力
2019/06/19 Javascript
解决Layui中templet中a的onclick参数传递的问题
2019/09/20 Javascript
vue中上传视频或图片或图片和文字一起到后端的解决方法
2019/12/01 Javascript
pycharm 使用心得(七)一些实用功能介绍
2014/06/06 Python
python 实现删除文件或文件夹实例详解
2016/12/04 Python
Python实用技巧之利用元组代替字典并为元组元素命名
2018/07/11 Python
python pyecharts 实现一个文件绘制多张图
2020/05/13 Python
python logging模块的使用
2020/09/07 Python
基于ccs3的timeline时间线实现方法
2020/04/30 HTML / CSS
HTML5的Geolocation地理位置定位API使用教程
2016/05/12 HTML / CSS
详解android与HTML混合开发总结
2018/06/06 HTML / CSS
学前班教师的自我鉴定
2013/12/05 职场文书
设计师求职信
2014/07/01 职场文书
旷课检讨书范文
2015/01/27 职场文书
班主任寄语2015
2015/02/26 职场文书
2016年校园重阳节广播稿
2015/12/18 职场文书
2019奶茶店创业计划书范本!
2019/07/15 职场文书
JavaScript实现一键复制内容剪贴板
2022/07/23 Javascript