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 相关文章推荐
ecshop 订单确认中显示省市地址信息的方法
Mar 15 PHP
php 的加密函数 md5,crypt,base64_encode 等使用介绍
Apr 09 PHP
解析PHP缓存函数的使用说明
May 10 PHP
PHP判断图片格式的七种方法小结
Jun 03 PHP
fetchAll()与mysql_fetch_array()的区别详解
Jun 05 PHP
解析PHP无限级分类方法及代码
Jun 21 PHP
PHP Curl多线程原理实例详解
Nov 06 PHP
php实现查看邮件是否已被阅读的方法
Dec 03 PHP
PDO::prepare讲解
Jan 29 PHP
php反射学习之依赖注入示例
Jun 14 PHP
php常用日期时间函数实例小结
Jul 04 PHP
基于PHP实现生成随机水印图片
Dec 09 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
php 字符串函数收集
2010/03/29 PHP
THINKPHP-Apache服务器中使用Alias虚拟目录URL重写 隐藏index.php
2021/03/09 PHP
模拟用户操作Input元素,不会触发相应事件
2007/05/11 Javascript
基于jQuery的简单的列表导航菜单
2011/03/02 Javascript
再谈querySelector和querySelectorAll的区别与联系
2012/04/20 Javascript
使用jQuery解决IE与FireFox下createElement方法的差异
2013/11/14 Javascript
JQuery性能优化的几点建议
2014/05/14 Javascript
jquery实现的Accordion折叠面板效果代码
2015/09/02 Javascript
js捕捉键盘事件和按键键值的方法
2016/10/10 Javascript
JavaScript callback回调函数用法实例分析
2018/05/08 Javascript
angular-tree-component的使用详解
2018/07/30 Javascript
原生js实现点击轮播切换图片
2020/02/11 Javascript
python操作mysql中文显示乱码的解决方法
2014/10/11 Python
python cx_Oracle模块的安装和使用详细介绍
2017/02/13 Python
Python基于回溯法子集树模板解决找零问题示例
2017/09/11 Python
基于循环神经网络(RNN)的古诗生成器
2018/03/26 Python
详解js文件通过python访问数据库方法
2019/03/03 Python
Python实现简单的列表冒泡排序和反转列表操作示例
2019/07/10 Python
python numpy之np.random的随机数函数使用介绍
2019/10/06 Python
如何用OpenCV -python3实现视频物体追踪
2019/12/04 Python
kafka监控获取指定topic的消息总量示例
2019/12/23 Python
Tensorflow获取张量Tensor的具体维数实例
2020/01/19 Python
Pycharm中安装Pygal并使用Pygal模拟掷骰子(推荐)
2020/04/08 Python
使用python创建生成动态链接库dll的方法
2020/05/09 Python
python通用数据库操作工具 pydbclib的使用简介
2020/12/21 Python
详解python3类型注释annotations实用案例
2021/01/20 Python
Canvas实现保存图片到本地的示例代码
2018/06/28 HTML / CSS
阿根廷票务网站:StubHub阿根廷
2018/04/13 全球购物
Monica Vinader官网:英国轻奢珠宝品牌
2020/02/05 全球购物
大学生通用个人自我评价
2014/04/27 职场文书
设计师求职信模板
2014/05/06 职场文书
2014年教师党员公开承诺书
2014/05/28 职场文书
申论不会写怎么办?教您掌握这6点思维和原则
2019/07/17 职场文书
创业计划书之情侣餐厅
2019/09/29 职场文书
Java Socket实现多人聊天系统
2021/07/15 Java/Android