PHP單一登入SSO實作方法
SSO即單一登錄,是一種控制多個相關但彼此獨立的系統的存取權限, 擁有此權限的使用者可以使用單一的ID和密碼存取某個或多個系統從而避免使用不同的使用者名稱或密碼,或透過某種配置無縫地登入每個系統。
對於大型系統來說使用單一登入可以減少使用者很多的麻煩。就拿百度來說吧,百度下面有很多的子系統——百度經驗、百度知道、百度文庫等等,如果我們使用這些系統的時候,每一個系統都需要我們輸入用戶名和密碼登入一次的話,我相信使用者體驗一定會直線下降。
與 SSO 互動的2個元素:1. 用戶,2. 系統,它的特點是:一次登錄,全部訪問。 SSO 是存取控制的一種,控制使用者能否登錄,即驗證使用者身份,而且是所有其它系統的身份驗證都在它這裡進行,從整個系統層面來看SSO ,它的核心就是這3個元素了:1. 用戶,2. 系統,3. 驗證中心。
1、同一個網域但不同的子網域如何進行單一登入
假如我們的網站是按照下面的網域進行部署的:
sub1.onmpw.com
sub2.onmpw.com
這兩個網站共用相同網域onmpw.com 。
預設情況下,瀏覽器會傳送 cookie 所屬的網域對應的主機。也就是說,來自於 sub1.onmpw.com 的 cookie 預設所屬的網域是 .sub1.onmpw.com 。因此,sub2.onmpw.com 不會得到任何的屬於 sub1.onmpw.com 的 cookie 資訊。因為它們是在不同的主機上面,而二者的子域也是不同的。
1.1 設定二者的cookie 資訊在同一個網域下
登入sub1.onmpw.com 系統
登入成功以後,產生唯一識別碼Token(知道token,就知道哪個使用者登入了)。設定 cookie 信息,這裡需要注意,將Token存到 cookie 中,但是在設定的時候必須將這 cookie 的所屬域設定為頂級域 .onmpw.com 。這裡可以使用 setcookie 函數,該函數的第四個參數是用來設定 cookie 所述域的。
setcookie(‘token’, ’xxx’, '/', ’.onmpw.com’);
訪問sub2.onmpw.com 系統,瀏覽器會將cookie 中的信息token 附帶在請求中一塊兒發送到sub2.onmpw.com 系統。這時該系統會先檢查 session 是否登錄,如果沒有登入則驗證 cookie 中的 token 從而實現自動登入。
sub2.onmpw.com 登入成功以後再寫 session 訊息。以後的驗證就用自己的 session 資訊驗證就可以了。
1.2 退出登入
這裡存在一個問題就是sub1 系統退出以後,除了可以清除自身的session 資訊和所屬域為.onmpw.com 的cookie 的訊息。它並不能清除 sub2 系統的 session 資訊。那 sub2 仍然是登入狀態。也就是說,這種方式雖說可以實現單一登錄,但是不能實現同時退出。原因是,sub1 和sub2 雖說透過setcookie 函數的設定可以共用cookie,但是二者的sessionId 是不同的,而且這個sessionId 在瀏覽器中也是以cookie 的形式儲存的,不過它所屬的網域並不是.onmpw. com 。
那要如何解決這個問題呢?我們知道,對於這種情況,只要是兩個系統的 sessionId 相同就可以解決這個問題了。也就是說存放 sessionId 的 cookie 所屬的網域也是 .onmpw.com 。在PHP中,sessionId 是在 session_start() 呼叫以後產生的。要使sub1 和sub2 有共同的sessionId ,那必須在session_start() 之前設定sessionId 所屬域:
ini_set('session.cookie_path', '/'); ini_set('session.cookie_domain', '.onmpw.com'); ini_set('session.cookie_lifetime', '0');
1、經過上面的步驟就可以實現不同二級域名的單點登錄與退出。
2、不過還可以簡化,如確保 sessionId 相同就可以實現不同二級網域的單一登入與登出。
參考文章: https://www.onmpw.com/tm/xwzj/network_145.html
2、不同網域之間如何實作單點登入
假設我們需要在以下這些站之間實作單一登入
www.onmpw1.com
www.onmpw2.com
www.onmpw3.com
上面的方案就不行了。
目前github 上有開源的SSO 解決方案,實作原理與主流SSO 差不多:
https://github.com/jasny/sso
wiki
demo
核心原理:
1、客戶端存取不同的子系統,子系統對應的SSO 使用者服務中心使用相同的SessionId。
2、子系統 Broker 與 Server 間透過 attach 進行了授權連結綁定
同根域名不指定 domain 根域名,第一次授权需要每次都要跳转到授权服务,但是指定了domain, 同根域名只要有一个授权成功,都可以共用那个 cookie 了,下次就不用再授权了,直接就可以请求用户信息了。
第一次访问A:
第二次访问B:
2.1 登录状态判断
用户到认证中心登录后,用户和认证中心之间建立起了会话,我们把这个会话称为全局会话。当用户后续访问系统应用时,我们不可能每次应用请求都到认证中心去判定是否登录,这样效率非常低下,这也是单Web应用不需要考虑的。
我们可以在系统应用和用户浏览器之间建立起局部会话,局部会话保持了客户端与该系统应用的登录状态,局部会话依附于全局会话存在,全局会话消失,局部会话必须消失。
用户访问应用时,首先判断局部会话是否存在,如存在,即认为是登录状态,无需再到认证中心去判断。如不存在,就重定向到认证中心判断全局会话是否存在,如存在,通知该应用,该应用与客户端就建立起它们之间局部会话,下次请求该应用,就不去认证中心验证了。
2.2 退出
用户在一个系统退出了,访问其它子系统,也应该是退出状态。要想做到这一点,应用除结束本地局部会话外,还应该通知认证中心该用户退出。
认证中心接到退出通知,即可结束全局会话,用户访问其它应用时,都显示已登出状态。
需不需要立即通知所有已建立局部会话的子系统,将它们的局部会话销毁,可根据实际项目来。
SSO( Single Sign On ),即单点登录,是一种控制多个相关但彼此独立的系统的访问权限, 拥有这一权限的用户可以使用单一的ID和密码访问某个或多个系统从而避免使用不同的用户名或密码,或者通过某种配置无缝地登录每个系统 。
对于大型系统来说使用单点登录可以减少用户很多的麻烦。就拿百度来说吧,百度下面有很多的子系统——百度经验、百度知道、百度文库等等,如果我们使用这些系统的时候,每一个系统都需要我们输入用户名和密码登录一次的话,我相信用户体验肯定会直线下降。
与 SSO 交互的2个元素:1. 用户,2. 系统,它的特点是:一次登录,全部访问。SSO 是访问控制的一种,控制用户能否登录,即验证用户身份,而且是所有其它系统的身份验证都在它这里进行,从整个系统层面来看 SSO ,它的核心就是这3个元素了:1. 用户,2. 系统,3. 验证中心。
1、同一个域但不同的子域如何进行单点登录
假如我们的站点是按照下面的域名进行部署的:
sub1.onmpw.com
sub2.onmpw.com
这两个站点共享同一域 onmpw.com 。
默认情况下,浏览器会发送 cookie 所属的域对应的主机。也就是说,来自于 sub1.onmpw.com 的 cookie 默认所属的域是 .sub1.onmpw.com 。因此,sub2.onmpw.com 不会得到任何的属于 sub1.onmpw.com 的 cookie 信息。因为它们是在不同的主机上面,并且二者的子域也是不同的。
1.1 设置二者的 cookie 信息在同一个域下
登录 sub1.onmpw.com 系统
登录成功以后,生成唯一标识符Token(知道token,就知道哪个用户登录了)。设置 cookie 信息,这里需要注意,将Token存到 cookie 中,但是在设置的时候必须将这 cookie 的所属域设置为顶级域 .onmpw.com 。这里可以使用 setcookie 函数,该函数的第四个参数是用来设置 cookie 所述域的。
setcookie(‘token’, ’xxx’, '/', ’.onmpw.com’);
访问 sub2.onmpw.com 系统,浏览器会将 cookie 中的信息 token 附带在请求中一块儿发送到 sub2.onmpw.com 系统。这时该系统会先检查 session 是否登录,如果没有登录则验证 cookie 中的 token 从而实现自动登录。
sub2.onmpw.com 登录成功以后再写 session 信息。以后的验证就用自己的 session 信息验证就可以了。
1.2 退出登录
这里存在一个问题就是 sub1 系统退出以后,除了可以清除自身的 session 信息和所属域为 .onmpw.com 的 cookie 的信息。它并不能清除 sub2 系统的 session 信息。那 sub2 仍然是登录状态。也就是说,这种方式虽说可以实现单点登录,但是不能实现同时退出。原因是,sub1 和 sub2 虽说通过 setcookie 函数的设置可以共享 cookie,但是二者的sessionId 是不同的,而且这个 sessionId 在浏览器中也是以 cookie 的形式存储的,不过它所属的域并不是 .onmpw.com 。
那如何解决这个问题呢?我们知道,对于这种情况,只要是两个系统的 sessionId 相同就可以解决这个问题了。也就是说存放 sessionId 的 cookie 所属的域也是 .onmpw.com 。在PHP中,sessionId 是在 session_start() 调用以后生成的。要想使sub1 和 sub2 有共同的 sessionId ,那必须在 session_start() 之前设置 sessionId 所属域:
ini_set('session.cookie_path', '/'); ini_set('session.cookie_domain', '.onmpw.com'); ini_set('session.cookie_lifetime', '0');
1、经过上面的步骤就可以实现不同二级域名的单点登录与退出。
2、不过还可以再简化,如确保 sessionId 相同就可以实现不同二级域名的单点登录与退出。
参考文章: https://www.onmpw.com/tm/xwzj/network_145.html
2、不同域之间如何实现单点登录
假设我们需要在以下这些站之间实现单点登录
www.onmpw1.com
www.onmpw2.com
www.onmpw3.com
上面的方案就行不通了。
目前 github 上有开源的 SSO 解决方案,实现原理与主流 SSO 差不多:
https://github.com/jasny/sso
wiki
demo
核心原理:
1、客户端访问不同的子系统,子系统对应的 SSO 用户服务中心使用相同的 SessionId。
2、子系统 Broker 与 Server 间通过 attach 进行了授权链接绑定
同根域名不指定 domain 根域名,第一次授权需要每次都要跳转到授权服务,但是指定了domain, 同根域名只要有一个授权成功,都可以共用那个 cookie 了,下次就不用再授权了,直接就可以请求用户信息了。
第一次访问A:
第二次访问B:
2.1 登录状态判断
用户到认证中心登录后,用户和认证中心之间建立起了会话,我们把这个会话称为全局会话。当用户后续访问系统应用时,我们不可能每次应用请求都到认证中心去判定是否登录,这样效率非常低下,这也是单Web应用不需要考虑的。
我们可以在系统应用和用户浏览器之间建立起局部会话,局部会话保持了客户端与该系统应用的登录状态,局部会话依附于全局会话存在,全局会话消失,局部会话必须消失。
用户访问应用时,首先判断局部会话是否存在,如存在,即认为是登录状态,无需再到认证中心去判断。如不存在,就重定向到认证中心判断全局会话是否存在,如存在,通知该应用,该应用与客户端就建立起它们之间局部会话,下次请求该应用,就不去认证中心验证了。
2.2 退出
用户在一个系统退出了,访问其它子系统,也应该是退出状态。要想做到这一点,应用除结束本地局部会话外,还应该通知认证中心该用户退出。
认证中心接到退出通知,即可结束全局会话,用户访问其它应用时,都显示已登出状态。
需不需要立即通知所有已建立局部会话的子系统,将它们的局部会话销毁,可根据实际项目来。
相关推荐:
以上是PHP單一登入SSO實作方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

PHP 8.4 帶來了多項新功能、安全性改進和效能改進,同時棄用和刪除了大量功能。 本指南介紹如何在 Ubuntu、Debian 或其衍生版本上安裝 PHP 8.4 或升級到 PHP 8.4

CakePHP 是 PHP 的開源框架。它旨在使應用程式的開發、部署和維護變得更加容易。 CakePHP 基於類似 MVC 的架構,功能強大且易於掌握。模型、視圖和控制器 gu

Visual Studio Code,也稱為 VS Code,是一個免費的原始碼編輯器 - 或整合開發環境 (IDE) - 可用於所有主要作業系統。 VS Code 擁有大量針對多種程式語言的擴展,可以輕鬆編寫

CakePHP 是一個開源MVC 框架。它使應用程式的開發、部署和維護變得更加容易。 CakePHP 有許多函式庫可以減少大多數常見任務的過載。

本教程演示瞭如何使用PHP有效地處理XML文檔。 XML(可擴展的標記語言)是一種用於人類可讀性和機器解析的多功能文本標記語言。它通常用於數據存儲
