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项目中比较通用的php自建函数的详解
Jun 06 PHP
PHP JS Ip地址及域名格式检测代码
Sep 27 PHP
PHP三元运算的2种写法代码实例
May 12 PHP
基于PHP的简单采集数据入库程序
Jul 30 PHP
destoon实现调用当前栏目分类及子分类和三级分类的方法
Aug 21 PHP
php防止sql注入简单分析
Mar 18 PHP
php生成zip文件类实例
Apr 07 PHP
解决php表单重复提交实现方法
Sep 29 PHP
php简单实现多语言切换的方法
May 09 PHP
PHP实现分布式memcache设置web集群session同步的方法
Apr 10 PHP
PHP中soap用法示例【SoapServer服务端与SoapClient客户端编写】
Dec 25 PHP
PHP中遍历数组的三种常用方法实例分析
Jun 24 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/11/25 PHP
常用的php ADODB使用方法集锦
2008/03/25 PHP
有关 PHP 和 MySQL 时区的一点总结
2008/03/26 PHP
php5.3 废弃函数小结
2010/05/16 PHP
php中DOMDocument简单用法示例代码(XML创建、添加、删除、修改)
2010/12/19 PHP
PHP获取文件夹内文件数的方法
2015/03/12 PHP
教你在header中隐藏php的版本信息
2016/08/10 PHP
PHP简单判断手机设备的方法
2016/08/23 PHP
yii2局部关闭(开启)csrf的验证的实例代码
2017/07/10 PHP
PHP使用CURL实现下载文件功能示例
2019/06/03 PHP
Jquery 高亮显示文本中重要的关键字
2009/12/24 Javascript
confirm的用法示例用于按钮操作时确定是否执行
2014/06/19 Javascript
使用jQueryMobile实现滑动翻页效果的方法
2015/02/04 Javascript
JavaScript在Android的WebView中parseInt函数转换不正确问题解决方法
2015/04/25 Javascript
js实现把图片的绝对路径转为base64字符串、blob对象再上传
2016/12/29 Javascript
JS SetInterval 代码实现页面轮询
2017/08/11 Javascript
JS实现为动态添加的元素增加事件功能示例【基于事件委托】
2018/03/21 Javascript
微信网页授权并获取用户信息的方法
2018/07/30 Javascript
详解JavaScript 为什么要有 Symbol 类型?
2019/04/03 Javascript
ES6 Iterator遍历器原理,应用场景及相关常用知识拓展详解
2020/02/15 Javascript
将Emacs打造成强大的Python代码编辑工具
2015/11/20 Python
详细介绍Python的鸭子类型
2016/09/12 Python
Python 模拟登陆的两种实现方法
2017/08/10 Python
Python计算开方、立方、圆周率,精确到小数点后任意位的方法
2018/07/17 Python
Pygame框架实现飞机大战
2020/08/07 Python
python用tkinter实现一个gui的翻译工具
2020/10/26 Python
python 制作网站筛选工具(附源码)
2021/01/21 Python
解决pytorch 模型复制的一些问题
2021/03/03 Python
实习护理工作自我评价
2013/09/25 职场文书
餐饮业会计岗位职责
2013/12/19 职场文书
授权委托书格式范文
2014/08/02 职场文书
维护民族团结演讲稿
2014/08/27 职场文书
自主招生专家推荐信
2015/03/26 职场文书
团组织关系介绍信
2019/06/24 职场文书
Python 数据可视化神器Pyecharts绘制图像练习
2022/02/28 Python
Spring Boot 实现 WebSocket
2022/04/30 Java/Android