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操作文件类的函数代码(文件和文件夹创建,复制,移动和删除)
Nov 10 PHP
在WINDOWS中设置计划任务执行PHP文件的方法
Dec 19 PHP
百度地图API使用方法详解
Aug 25 PHP
人脸识别测颜值、测脸龄、测相似度微信接口
Apr 07 PHP
PHP根据session与cookie用户登录状态操作类的代码
May 13 PHP
php求今天、昨天、明天时间戳的简单实现方法
Jul 28 PHP
php PDO判断连接是否可用的实现方法
Apr 03 PHP
php 类中的常量、静态属性、非静态属性的区别
Apr 09 PHP
Laravel框架用户登陆身份验证实现方法详解
Sep 14 PHP
基于php流程控制语句和循环控制语句(讲解)
Oct 23 PHP
PHP中__set()实例用法和基础讲解
Jul 23 PHP
基于thinkphp5框架实现微信小程序支付 退款 订单查询 退款查询操作
Aug 17 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 cli模式学习(PHP命令行模式)
2013/06/03 PHP
浅析51个PHP处理字符串的函数
2013/08/02 PHP
php写入数据到CSV文件的方法
2015/03/14 PHP
关于php中的json_encode()和json_decode()函数的一些说明
2016/11/20 PHP
Zend Framework入门教程之Zend_Mail用法示例
2016/12/08 PHP
JavaScript 开发中规范性的一点感想
2009/06/23 Javascript
在一个js文件里远程调用jquery.js会在ie8下的一个奇怪问题
2010/11/28 Javascript
jquery绑定原理 简单解析与实现代码分享
2011/09/06 Javascript
JS字符串累加Array不一定比字符串累加快(根据电脑配置)
2012/05/14 Javascript
jQuery中对未来的元素绑定事件用bind、live or on
2014/04/17 Javascript
Google官方支持的NodeJS访问API,提供后台登录授权
2014/07/29 NodeJs
javascript下拉列表菜单的实现方法
2015/11/18 Javascript
如何利用JSHint减少JavaScript的错误
2016/08/23 Javascript
JS实现超简单的汉字转拼音功能示例
2016/12/22 Javascript
利用VUE框架,实现列表分页功能示例代码
2017/01/12 Javascript
详解js的异步编程技术的方法
2017/02/09 Javascript
Vue.js 2.0学习教程之从基础到组件详解
2017/04/24 Javascript
获取layer.open弹出层的返回值方法
2018/08/20 Javascript
从0到1搭建Element的后台框架的方法步骤
2019/04/10 Javascript
ES6数组与对象的解构赋值详解
2019/06/14 Javascript
JavaScript实现简单计算器
2020/03/19 Javascript
javascript读取本地文件和目录方法详解
2020/08/06 Javascript
[36:05]DOTA2亚洲邀请赛 3.31 小组赛 A组 Liquid vs Optic
2018/04/01 DOTA
[03:55]TI9战队采访——TNC Predator
2019/08/22 DOTA
详解Django-restframework 之频率源码分析
2019/02/27 Python
很酷的python表白工具 你喜欢我吗
2019/04/11 Python
解决Pyinstaller 打包exe文件 取消dos窗口(黑框框)的问题
2019/06/21 Python
从训练好的tensorflow模型中打印训练变量实例
2020/01/20 Python
django 将自带的数据库sqlite3改成mysql实例
2020/07/09 Python
python中HTMLParser模块知识点总结
2021/01/25 Python
利用HTML5实现使用按钮控制背景音乐开关
2015/09/21 HTML / CSS
小学生清明节演讲稿
2014/09/05 职场文书
城管执法人员个人对照检查材料思想汇报
2014/09/29 职场文书
公安个人四风问题对照检查及整改措施
2014/10/28 职场文书
文明医院的标语集锦!
2019/07/24 职场文书
Python实现提取PDF简历信息并存入Excel
2022/04/02 Python