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下HTTP Response中的Chunked编码实现方法
Nov 19 PHP
Blitz templates 最快的PHP模板引擎
Apr 06 PHP
.htaccess文件保护实例讲解
Feb 06 PHP
php中base_convert()进制数字转换函数实例
Nov 20 PHP
php中array_multisort对多维数组排序的方法
Jun 21 PHP
PHP环境中Memcache的安装和使用
Nov 05 PHP
php实现微信公众号主动推送消息
Dec 31 PHP
Yii2使用dropdownlist实现地区三级联动功能的方法
Jul 18 PHP
PHP中session跨子域的三种实现方法
Jul 25 PHP
Laravel5权限管理方法详解
Jul 26 PHP
基于PHP实现用户注册登录功能
Oct 14 PHP
基于PHP实现用户登录注册功能的详细教程
Aug 04 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多文件上传实现代码
2014/02/20 PHP
php判断一个数组是否为有序的方法
2015/03/27 PHP
PHP获取类私有属性的3种方法
2020/09/10 PHP
JS实现self的resend
2010/07/22 Javascript
jquery 提示信息显示后自动消失的具体实现
2013/12/18 Javascript
巧用局部变量提升javascript性能
2014/02/24 Javascript
jquery处理页面弹出层查询数据等待操作实例
2015/03/25 Javascript
bootstrap网格系统使用方法解析
2017/01/13 Javascript
微信小程序Redux绑定实例详解
2017/06/07 Javascript
微信小程序开发教程之增加mixin扩展
2017/08/09 Javascript
基于vue-cli配置lib-flexible + rem实现移动端自适应
2017/12/26 Javascript
Jquery高级应用Deferred对象原理及使用实例
2020/05/28 jQuery
微信小程序wx.getUserInfo授权获取用户信息(头像、昵称)的实现
2020/08/19 Javascript
[54:28]EG vs OG 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/18 DOTA
python SMTP实现发送带附件电子邮件
2018/05/22 Python
pygame游戏之旅 添加游戏界面按键图形
2018/11/20 Python
Python读取指定日期邮件的实例
2019/02/01 Python
python仿evething的文件搜索器实例代码
2019/05/13 Python
python+webdriver自动化环境搭建步骤详解
2019/06/03 Python
Python+Dlib+Opencv实现人脸采集并表情判别功能的代码
2020/07/01 Python
彻底弄明白CSS3的Media Queries(跨平台设计)
2010/07/27 HTML / CSS
纯css3(无图片/js)制作的几个社交媒体网站的图标
2013/03/21 HTML / CSS
阿迪达斯加拿大官网:Adidas加拿大
2016/08/25 全球购物
YOINS官网:时尚女装网上购物
2017/03/17 全球购物
深深扎根运动世界的生活品牌:Tillys
2017/10/30 全球购物
大学生军训广播稿
2014/01/24 职场文书
幼儿园大班评语大全
2014/04/17 职场文书
汽车广告策划方案
2014/05/31 职场文书
反对邪教标语
2014/06/30 职场文书
单身证明范本
2015/06/15 职场文书
祝福语集锦:送给毕业同学祝福语
2019/11/21 职场文书
Django利用AJAX技术实现博文实时搜索
2021/05/06 Python
Golang Gob编码(gob包的使用详解)
2021/05/07 Golang
vue实现水波涟漪效果的点击反馈指令
2021/05/31 Vue.js
Tomcat用户管理的优化配置详解
2022/03/31 Servers
利用Python实时获取steam特惠游戏数据
2022/06/25 Python