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 curl 登录163邮箱并抓取邮箱好友列表的代码(经测试)
Apr 07 PHP
PHP语言中global和$GLOBALS[]的分析 之二
Feb 02 PHP
php错误、异常处理机制(补充)
May 07 PHP
Laravel框架学习笔记(一)环境搭建
Oct 15 PHP
php解析字符串里所有URL地址的方法
Apr 03 PHP
学习php设计模式 php实现策略模式(strategy)
Dec 07 PHP
php获取图片信息的方法详解
Dec 10 PHP
详解PHP实现执行定时任务
Dec 21 PHP
两种php实现图片上传的方法
Jan 22 PHP
无需数据库在线投票调查php代码
Jul 20 PHP
PHP创建单例后台进程的方法示例
May 23 PHP
php单元测试phpunit入门实例教程
Nov 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 set_error_handler()函数使用详解(示例)
2013/11/12 PHP
php实现下载限制速度示例分享
2014/02/13 PHP
php定义一个参数带有默认值的函数实例分析
2015/03/16 PHP
javascript打开新窗口同时关闭旧窗口
2009/01/16 Javascript
jquery text()要注意啦
2009/10/30 Javascript
javascript 设置文本框中焦点的位置
2009/11/20 Javascript
40个新鲜出炉的jQuery 插件和免费教程[上]
2012/07/24 Javascript
JS验证控制输入中英文字节长度(input、textarea等)具体实例
2013/06/21 Javascript
jQuery实现高亮显示的方法
2015/03/10 Javascript
在JavaScript中处理时间之setMinutes()方法的使用
2015/06/11 Javascript
JavaScript实现搜索框的自动完成功能(一)
2016/02/25 Javascript
浅谈JavaScript对象与继承
2016/07/10 Javascript
jQuery实现复制到粘贴板功能
2017/02/11 Javascript
Javascript中prototype与__proto__的关系详解
2018/03/11 Javascript
如何在js代码中消灭for循环实例详解
2018/07/29 Javascript
jQuery滑动效果实现方法分析
2018/09/05 jQuery
three.js搭建室内场景教程
2018/12/30 Javascript
python正则表达式中的括号匹配问题
2014/12/14 Python
Python打包可执行文件的方法详解
2016/09/19 Python
Python编程实现双击更新所有已安装python模块的方法
2017/06/05 Python
Python实现批量压缩图片
2018/01/25 Python
Python键盘输入转换为列表的实例
2018/06/23 Python
Python 使用PIL中的resize进行缩放的实例讲解
2018/08/03 Python
Python 实现「食行生鲜」签到领积分功能
2018/09/26 Python
Python图像处理库PIL的ImageFont模块使用介绍
2020/02/26 Python
opencv python在视屏上截图功能的实现
2020/03/05 Python
Python matplotlib读取excel数据并用for循环画多个子图subplot操作
2020/07/14 Python
MATCHESFASHION.COM美国官网:英国奢侈品零售商
2018/10/29 全球购物
美国转售二手商品的电子商务平台:BLINQ
2018/12/13 全球购物
高三家长寄语
2014/04/03 职场文书
煤矿安全生产责任书
2014/04/15 职场文书
秋天的图画教学反思
2014/05/01 职场文书
超越自我演讲稿
2014/05/21 职场文书
医生党的群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
2019个人半年工作总结
2019/06/21 职场文书
vue实现input输入模糊查询的三种方式
2022/08/14 Vue.js