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 相关文章推荐
层叠菜单的动态生成
Oct 09 PHP
无数据库的详细域名查询程序PHP版(1)
Oct 09 PHP
非常不错的MySQL优化的8条经验
Mar 24 PHP
Zend 输出产生XML解析错误
Mar 03 PHP
simplehtmldom Doc api帮助文档
Mar 26 PHP
让ThinkPHP支持大小写url地址访问的方法
Oct 31 PHP
浅谈json_encode用法
Mar 05 PHP
php对文件进行hash运算的方法
Apr 03 PHP
Yii框架弹出框功能示例
Jan 07 PHP
PHP实现针对日期,月数,天数,周数,小时,分,秒等的加减运算示例【基于strtotime】
Apr 19 PHP
PHP实现蛇形矩阵,回环矩阵及数字螺旋矩阵的方法分析
May 29 PHP
基于PHP实现用户登录注册功能的详细教程
Aug 04 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
用PHP实现小型站点广告管理
2006/10/09 PHP
检测codeigniter脚本消耗内存情况的方法
2015/03/21 PHP
php实现将任意进制数转换成10进制的方法
2015/04/17 PHP
PHP遍历数组的方法汇总
2015/04/30 PHP
typecho插件编写教程(二):写一个新插件
2015/05/28 PHP
使用jquery给input和textarea设定ie中的focus
2008/05/29 Javascript
基于javascipt-dom编程 table对象的使用
2013/04/22 Javascript
AngularJS入门教程之学习环境搭建
2014/12/06 Javascript
原生JS实现LOADING效果
2015/03/16 Javascript
javascript中加var和不加var的区别 你真的懂吗
2016/01/06 Javascript
基于HTML5上使用iScroll实现下拉刷新,上拉加载更多
2016/05/21 Javascript
ionic js 模型 $ionicModal 可以遮住用户主界面的内容框
2016/06/06 Javascript
JavaScript的this关键字的理解
2016/06/18 Javascript
IE下JS保存图片的简单实例
2016/07/15 Javascript
完美解决jQuery 鼠标快速滑过后,会执行多次滑出的问题
2016/12/08 Javascript
vue cli使用绝对路径引用图片问题的解决
2017/12/06 Javascript
jQuery实现手机号正则验证输入及自动填充空格功能
2018/01/02 jQuery
JavaScript基础心法 数据类型
2018/03/05 Javascript
详解node Async/Await 更好的异步编程解决方案
2018/05/10 Javascript
webpack打包非模块化js的方法
2018/10/24 Javascript
jQuery实现html可联动的百分比进度条
2020/03/26 jQuery
微信小程序实现签到弹窗动画
2020/09/21 Javascript
[22:07]DOTA2-DPC中国联赛 正赛 iG vs Magma 选手采访
2021/03/11 DOTA
老生常谈python中的重载
2018/11/11 Python
python并发和异步编程实例
2018/11/15 Python
Python两个字典键同值相加的几种方法
2019/03/05 Python
python实现的发邮件功能示例
2019/09/11 Python
Python搭建代理IP池实现检测IP的方法
2019/10/27 Python
python 实现屏幕录制示例
2019/12/23 Python
最畅销的视频游戏享受高达90%的折扣:CDKeys
2020/02/10 全球购物
Linux文件操作命令都有哪些
2016/07/23 面试题
自动化专业本科毕业生求职信
2013/10/20 职场文书
技能培训通讯稿
2015/07/18 职场文书
Java Socket实现多人聊天系统
2021/07/15 Java/Android
Kubernetes中Deployment的升级与回滚
2022/04/01 Servers
python playwright之元素定位示例详解
2022/07/23 Python