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 相关文章推荐
PHP4实际应用经验篇(2)
Oct 09 PHP
php下获取客户端ip地址的函数
Mar 15 PHP
php5.5中类级别的常量使用介绍
Oct 02 PHP
php利用腾讯ip分享计划获取地理位置示例分享
Jan 20 PHP
destoon调用discuz论坛中带图片帖子的实现方法
Aug 21 PHP
PHP处理大量表单字段的便捷方法
Feb 07 PHP
基于PHP实现简单的随机抽奖小程序
Jan 05 PHP
PHP和MySql中32位和64位的整形范围是多少
Feb 18 PHP
PHP使用文件锁解决高并发问题示例
Mar 29 PHP
PHP多进程简单实例小结
Nov 09 PHP
php高性能日志系统 seaslog 的安装与使用方法分析
Feb 29 PHP
PHP基于phpqrcode类生成二维码的方法示例详解
Aug 07 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动态编译出现Cannot find autoconf的解决方法
2014/11/05 PHP
php版阿里云OSS图片上传类详解
2016/12/01 PHP
php图形jpgraph操作实例分析
2017/02/22 PHP
FormValidate 表单验证功能代码更新并提供下载
2008/08/23 Javascript
javascript 一些用法小结
2009/09/11 Javascript
firefox和IE系列的相关区别整理 以备后用
2009/12/28 Javascript
Javascript中的相等与不等运算
2010/04/25 Javascript
jQuery语法高亮插件支持各种程序源代码语法着色加亮
2013/04/27 Javascript
Javascript代码在页面加载时的执行顺序介绍
2013/05/03 Javascript
用jquery生成二级菜单的实例代码
2013/06/24 Javascript
jQuery中:first-child选择器用法实例
2014/12/31 Javascript
使用javascript提交form表单方法汇总
2015/06/25 Javascript
JS+CSS实现美化的下拉列表框效果
2015/08/11 Javascript
JS本地刷新返回上一页代码
2016/07/25 Javascript
Javascript农历与公历相互转换的简单实例
2016/10/09 Javascript
node+express制作爬虫教程
2016/11/11 Javascript
jquery点击展示与隐藏更多内容
2016/12/03 Javascript
bootstrap动态添加面包屑(breadcrumb)及其响应事件的方法
2017/05/25 Javascript
微信小程序实现获取用户信息并存入数据库操作示例
2019/05/07 Javascript
JS实现数据动态渲染的竖向步骤条
2020/06/24 Javascript
javascript自定义加载loading效果
2020/09/15 Javascript
python对url格式解析的方法
2015/05/13 Python
Python中的asyncio代码详解
2019/06/10 Python
Python 列表去重去除空字符的例子
2019/07/20 Python
如何在 Django 模板中输出 &quot;{{&quot;
2020/01/24 Python
tensorflow 报错unitialized value的解决方法
2020/02/06 Python
python 获取字典键值对的实现
2020/11/12 Python
StubHub智利:购买和出售您的门票
2016/11/23 全球购物
有趣的睡衣和礼物:LazyOne
2019/11/27 全球购物
北大青鸟学生求职信
2013/09/24 职场文书
大学迎新晚会主持词
2014/03/24 职场文书
会计工作态度自我评价
2015/03/06 职场文书
证券公司客户经理岗位职责
2015/04/09 职场文书
干货干货!2019最新优秀创业计划书
2019/03/21 职场文书
Python 处理表格进行成绩排序的操作代码
2021/07/26 Python
纯 CSS 自定义多行省略的问题(从原理到实现)
2021/11/11 HTML / CSS