簡(jiǎn)單理解SSO單點(diǎn)登錄之代碼實(shí)踐

SSO即單點(diǎn)登錄,百度有很多專業(yè)的講解和理論知識(shí)。本文以簡(jiǎn)化的PHP代碼案例來(lái)讓大家拋開理念,更簡(jiǎn)單認(rèn)識(shí)SSO的應(yīng)用,最好能展開自己的理解。
我這邊簡(jiǎn)單配置了3個(gè)域名及對(duì)應(yīng)的文件夾

├─A 文件夾               a.com  應(yīng)用系統(tǒng)
│  ├─index.php   
│  └─login.php
│
├─B 文件夾               b.com  應(yīng)用系統(tǒng)
│  ├─index.php
│  └─login.php
│
├─C 文件夾               c.com  登錄系統(tǒng)
│  └─login.php

A和B都是業(yè)務(wù)系統(tǒng),C是專門用來(lái)登錄的系統(tǒng),都不在一個(gè)域。
當(dāng)然,這里把它們抽離開來(lái)只是簡(jiǎn)化抽象便于理解。
下面看下 A 服務(wù)器的文件(服務(wù)器B僅uri與A不同):

-------------------------------------index.php-------------------------------------
<!DOCTYPE html>
<html>
<head>
    <title></title>
</head>
<body>
<h1><?= isset($_COOKIE['userInfo'])?$_COOKIE['userInfo']:'----' ?></h1>
<a href="login.php">登錄</a>

</body>
</html>
-------------------------------------login.php-------------------------------------
<?php
// 已在本站登錄,直接返回
if (isset($_COOKIE['userInfo'])) {
    echo '<script> location = "/"</script>';
    die;
}
// 由登陸中心登錄成功返回過(guò)來(lái)的,處理并返回用戶操作
if (isset($_GET['action']) && $_GET['action'] == 'sso') {
    setcookie('userInfo',$_GET['userInfo']);
    echo '<script> location = "/"</script>';
    die;
}
// 未登錄,跳轉(zhuǎn)至登陸中心
if (!isset($_COOKIE['userInfo'])) {
    header('Location: http://c.com/login.php?uri=a.com');
    die;
}

下面看下登錄系統(tǒng) C 的代碼:

-------------------------------------login.php-------------------------------------
<?php
//已在登陸中心登錄,直接返回登錄站點(diǎn)
if (isset($_COOKIE['userInfo'])) {
    header('Location: http://'.$_GET['uri'].'/login.php?action=sso&userInfo='.$_COOKIE['userInfo']);
    die;
}
//登錄處理并返回
if (isset($_POST['userInfo'])) {
    setcookie('userInfo',$_POST['userInfo']);
    header('Location: http://'.$_GET['uri'].'/login.php?action=sso&userInfo='.$_POST['userInfo']);
    die;
}
?>
<!-- 未登錄時(shí),登錄表單 -->
<!DOCTYPE html>
<html>
<head>
    <title></title>
</head>
<body>
    <form  action="login.php?uri=<?= $_GET['uri'] ?>"  method="post">
        姓名:<input type="text" name="userInfo">
        <button>登錄</button>
    </form>
</body>
</html>

以上就是一個(gè)簡(jiǎn)單的SSO單點(diǎn)登錄系統(tǒng)方案。當(dāng)然實(shí)際應(yīng)用中,會(huì)有redis...來(lái)存儲(chǔ)公共的登錄數(shù)據(jù),每個(gè)業(yè)務(wù)系統(tǒng)會(huì)有自己的權(quán)限驗(yàn)證。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,045評(píng)論 25 709
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,564評(píng)論 19 139
  • 下午和業(yè)務(wù)溝通需求時(shí),想到某個(gè)程序菜單節(jié)點(diǎn)的優(yōu)化,大腦里已經(jīng)想通了,但后來(lái)隔兩個(gè)小時(shí)后寫prd文檔時(shí)就忘記了,導(dǎo)致...
    A小蚊子閱讀 246評(píng)論 0 1
  • 當(dāng)十四歲的青春年華 遇上這紙醉金迷的繁華世界 當(dāng)一顆已經(jīng)變污穢的心 再次燃出美麗的火花 當(dāng)一切變的不這么簡(jiǎn)單 我該...
    褪盡芳華閱讀 203評(píng)論 0 0
  • 《大秦帝國(guó)》表現(xiàn)了一個(gè)重要?dú)v史事件:楚懷王被騙于武關(guān)會(huì)盟,困于章臺(tái),客死他鄉(xiāng)?!读H藺相如列傳》里也有“秦王坐章臺(tái)...
    霍子荷閱讀 4,952評(píng)論 19 34

友情鏈接更多精彩內(nèi)容