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 相关文章推荐
用PHP控制用户的浏览器--ob*函数的使用说明
Mar 16 PHP
php escape URL编码
Dec 10 PHP
php对mongodb的扩展(初出茅庐)
Nov 11 PHP
php cli模式学习(PHP命令行模式)
Jun 03 PHP
PHP抓屏函数实现屏幕快照代码分享
Jan 02 PHP
PHP内存缓存Memcached类实例
Dec 08 PHP
一个PHP实现的轻量级简单爬虫
Jul 08 PHP
使用Yii2实现主从数据库设置
Nov 20 PHP
PHP小程序支付功能完整版【基于thinkPHP】
Mar 26 PHP
PHP实现获取url地址中顶级域名的方法示例
Jun 05 PHP
php实现银联商务公众号+服务窗支付的示例代码
Oct 12 PHP
laravel 出现command not found问题的解决方案
Oct 23 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 str_pad 函数用法简介
2009/07/11 PHP
PHP中生成UUID自定义函数分享
2015/06/10 PHP
在PHP中使用FastCGI解析漏洞及修复方案
2015/11/10 PHP
php字符串过滤strip_tags()函数用法实例分析
2019/06/24 PHP
javascript (用setTimeout而非setInterval)
2011/12/28 Javascript
JavaScript中如何通过arguments对象实现对象的重载
2014/05/12 Javascript
jQuery 重复加载错误以及修复方法
2014/12/16 Javascript
JavaScript获取网页、浏览器、屏幕高度和宽度汇总
2014/12/18 Javascript
jquery插入兄弟节点的操作方法
2016/12/07 Javascript
vue-router实现webApp切换页面动画效果代码
2017/05/25 Javascript
浅析vue深复制
2018/01/29 Javascript
基于element-ui组件手动实现单选和上传功能
2018/12/06 Javascript
Vue-cli3.x + axios 跨域方案踩坑指北
2019/07/04 Javascript
原生js代码能实现call和bind吗
2019/07/31 Javascript
JS实现小星星特效
2019/12/24 Javascript
vue实现图书管理系统
2020/12/29 Vue.js
[52:06]完美世界DOTA2联赛决赛日 Inki vs LBZS 第一场 11.08
2020/11/10 DOTA
python字典基本操作实例分析
2015/07/11 Python
python实现壁纸批量下载代码实例
2018/01/25 Python
pandas 数据实现行间计算的方法
2018/06/08 Python
python  文件的基本操作 菜中菜功能的实例代码
2019/07/17 Python
python实现BP神经网络回归预测模型
2019/08/09 Python
python为Django项目上的每个应用程序创建不同的自定义404页面(最佳答案)
2020/03/09 Python
python新式类和经典类的区别实例分析
2020/03/23 Python
Python常用编译器原理及特点解析
2020/03/23 Python
详解python中groupby函数通俗易懂
2020/05/14 Python
使用sklearn对多分类的每个类别进行指标评价操作
2020/06/11 Python
PyCharm+PyQt5+QtDesigner配置详解
2020/08/12 Python
实例讲解CSS3中Transform的perspective属性的用法
2016/04/22 HTML / CSS
利用canvas实现图片下载功能来实现浏览器兼容问题
2019/05/31 HTML / CSS
Ticketmaster德国票务网站:购买音乐会和体育等门票
2016/11/14 全球购物
马来西亚网上购物平台:ezbuy
2018/02/13 全球购物
2014年高中班主任工作总结
2014/11/08 职场文书
先进班组材料范文
2014/12/25 职场文书
课外活动实习计划
2015/01/19 职场文书
死亡诗社观后感
2015/06/05 职场文书