php的sso單點(diǎn)登錄實(shí)現(xiàn)方法
本文實(shí)例講述了php的sso單點(diǎn)登錄實(shí)現(xiàn)方法。分享給大家供大家參考。具體分析如下:
這里詳細(xì)講到了幾點(diǎn):
1、點(diǎn)擊登錄跳轉(zhuǎn)到SSO登錄頁(yè)面并帶上當(dāng)前應(yīng)用的callback地址
2、登錄成功后生成COOKIE并將COOKIE傳給callback地址
3、callback地址接收SSO的COOKIE并設(shè)置在當(dāng)前域下再跳回到應(yīng)用1即完成登錄
4、再在應(yīng)用程序需要登錄的地方嵌入一個(gè)iframe用來(lái)實(shí)時(shí)檢測(cè)登錄狀態(tài),代碼如下:
index.php 應(yīng)用程序頁(yè)面:
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地址用于回調(diào)設(shè)置cookie
if(isset($_COOKIE['sign'])){
exit("歡迎您{$_COOKIE['sign']} <a href="login.php?logout">退出</a>");
}else{
echo '您還未登錄 <a href="'.$sso_address.'?callback='.$callback_address.'">點(diǎn)此登錄</a>';
}
?>
<iframe src="<?php echo $sso_address ?>?callback=<?php echo $callback_address ?>" frameborder="0" width="0" height="0"></iframe>
login.php SSO登錄頁(yè)面:
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 "系統(tǒng)檢測(cè)到您已登錄 {$_COOKIE['sign']} <a href="{$_GET['callback']}?{$query}">授權(quán)</a> <a href="?logout">退出</a>";
}
?>
callback.php 回調(diào)頁(yè)面用來(lái)設(shè)置跨域COOKIE:
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 用來(lái)檢測(cè)登錄狀態(tài)的頁(yè)面,內(nèi)嵌在頁(yè)面的iframe中:
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>
希望本文所述對(duì)大家的php程序設(shè)計(jì)有所幫助。
- php實(shí)現(xiàn)的SSO單點(diǎn)登錄系統(tǒng)接入功能示例分析
- PHP簡(jiǎn)單實(shí)現(xiàn)單點(diǎn)登錄功能示例
- SSO單點(diǎn)登錄的PHP實(shí)現(xiàn)方法(Laravel框架)
- PHP實(shí)現(xiàn)cookie跨域session共享的方法分析
- ThinkPHP框架實(shí)現(xiàn)session跨域問(wèn)題的解決方法
- php中http與https跨域共享session的解決方法
- PHP關(guān)于IE下的iframe跨域?qū)е聅ession丟失問(wèn)題解決方法
- PHP簡(jiǎn)單實(shí)現(xiàn)HTTP和HTTPS跨域共享session解決辦法
- php實(shí)現(xiàn)多站點(diǎn)共用session實(shí)現(xiàn)單點(diǎn)登錄的方法詳解
相關(guān)文章
PHP Memcached應(yīng)用實(shí)現(xiàn)代碼
在很多場(chǎng)合,我們都會(huì)聽到 memcached 這個(gè)名字,但很多同學(xué)只是聽過(guò),并沒(méi)有用過(guò)或?qū)嶋H了解過(guò),只知道它是一個(gè)很不錯(cuò)的東東。這里簡(jiǎn)單介紹一下,memcached 是高效、快速的分布式內(nèi)存對(duì)象緩存系統(tǒng),主要用于加速 WEB 動(dòng)態(tài)應(yīng)用程序。2010-02-02
PHP 使用openssl 擴(kuò)展實(shí)現(xiàn)公鑰加密的方法
下面小編就為大家分享一篇PHP 使用openssl 擴(kuò)展實(shí)現(xiàn)公鑰加密的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-03-03
PHP實(shí)現(xiàn)惡意DDOS攻擊避免帶寬占用問(wèn)題方法
這篇文章主要介紹了PHP實(shí)現(xiàn)惡意DDOS攻擊避免帶寬占用問(wèn)題方法,本文介紹的是一個(gè)簡(jiǎn)單方法,需要的朋友可以參考下2015-05-05
PHP的魔術(shù)常量__METHOD__簡(jiǎn)介
這篇文章主要介紹了PHP的魔術(shù)常量__METHOD__簡(jiǎn)介,使用__METHOD__可以獲取類中的方法名稱,PHP5之后新增的魔術(shù)常量,需要的朋友可以參考下2014-07-07
自己寫的兼容低于PHP 5.5版本的array_column()函數(shù)
這篇文章主要介紹了自己寫的兼容低于PHP 5.5版本的array_column()函數(shù),array_column是PHP 5.5新增函數(shù),有時(shí)在低版本中也可能要用到,需要的朋友可以參考下2014-10-10

