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调用数据库的存贮过程!
Oct 09 PHP
php的curl实现get和post的代码
Aug 23 PHP
php利用header函数实现文件下载时直接提示保存
Nov 12 PHP
php另类上传图片的方法(PHP用Socket上传图片)
Oct 30 PHP
PHP错误Cannot use object of type stdClass as array in错误的解决办法
Jun 12 PHP
php获取从百度、谷歌等搜索引擎进入网站关键词的方法
Jul 08 PHP
php验证码实现代码(3种)
Sep 07 PHP
PHP MySql增删改查的简单实例
Jun 21 PHP
php魔术方法功能与用法实例分析
Oct 19 PHP
PHP长连接实现与使用方法详解
Feb 11 PHP
PDO::_construct讲解
Jan 27 PHP
PHP设计模式之抽象工厂模式实例分析
Mar 25 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获取ip的三个属性区别介绍(HTTP_X_FORWARDED_FOR,HTTP_VIA,REMOTE_ADDR)
2012/09/23 PHP
浅析php学习的路线图
2013/07/10 PHP
php可应用于面包屑导航的迭代寻找家谱树实现方法
2015/02/02 PHP
学习php设计模式 php实现合成模式(composite)
2015/12/08 PHP
PHP实现动态添加XML中数据的方法
2018/03/30 PHP
TP5框架使用QueryList采集框架爬小说操作示例
2020/03/26 PHP
javascript indexOf函数使用说明
2008/07/03 Javascript
javascript面向对象编程(一) 实例代码
2010/06/25 Javascript
关于JavaScript的面向对象和继承有利新手学习
2013/01/11 Javascript
js判断图片加载完成后获取图片实际宽高的方法
2016/02/25 Javascript
Bootstrap+jfinal退出系统弹出确认框的实现方法
2016/05/30 Javascript
AngularJS入门教程之更多模板详解
2016/08/19 Javascript
JSON 对象未定义错误的解决方法
2016/09/29 Javascript
详解Vue2 无限级分类(添加,删除,修改)
2017/03/07 Javascript
angular.extend方法的具体使用
2017/09/14 Javascript
jQuery实现每隔一段时间自动更换样式的方法分析
2018/05/03 jQuery
自己动手封装一个React Native多级联动
2018/09/19 Javascript
原生js代码能实现call和bind吗
2019/07/31 Javascript
vue中选中多个选项并且改变选中的样式的实例代码
2020/09/16 Javascript
uniapp微信小程序实现一个页面多个倒计时
2020/11/01 Javascript
python标准日志模块logging的使用方法
2013/11/01 Python
解决sublime+python3无法输出中文的问题
2018/12/12 Python
python 实现图片旋转 上下左右 180度旋转的示例
2019/01/24 Python
matplotlib命令与格式之tick坐标轴日期格式(设置日期主副刻度)
2019/08/06 Python
HTML5打开本地app应用的方法
2016/03/31 HTML / CSS
美国娱乐和流行文化商品店:FYE
2017/09/14 全球购物
澳大利亚礼品卡商店:Gift Card Store
2019/06/24 全球购物
求职者应聘的自我评价
2013/10/16 职场文书
大学教师年终总结的自我评价
2013/10/29 职场文书
自我评价优秀范文分享
2013/11/30 职场文书
开办化妆品公司创业计划书
2013/12/26 职场文书
小学毕业感言150字
2014/02/05 职场文书
四查四看剖析材料
2014/02/14 职场文书
物资采购管理制度
2015/08/06 职场文书
党员学习中国梦心得体会
2016/01/05 职场文书
mysql通过group by分组取最大时间对应数据的两种有效方法
2022/09/23 MySQL