SSO英文全稱Single Sign On,單點登錄,SSO是在多個應用系統中,用戶只需要登錄一次就可以訪問所有相互信任的應用系統,它包括可以將這次主要的登錄映射到其他應用中用于同一個用戶的登錄的機制,它是目前比較流行的企業業務整合的解決方案之一,下面我們來看看吧,
簡單講一下 SSO 單點登錄系統的接入的原理,前提是系統本身有完善的用戶認證功能,即基本的用戶登錄功能,那實作起來就很方便了,
SSO 登錄請求介面往往是介面加上一個回呼地址,訪問這個地址會跳轉到回呼地址并帶上一個 ticket 引數,拿著這個 ticket 引數再請求介面可以獲取到用戶資訊,如果存在用戶則自動登錄,不存在就新增用戶并登錄,
比如這個 SSO 模型實作了兩個方法,一個是獲取介面 url,一個是憑 ticket 獲取用戶資訊:
interface SSOLogin { /** * 獲取登錄用戶資訊 * @param $ticket * @return mixed */ public function getInfoFromTicket($ticket); /** * 單點登錄授權地址 * @return mixed */ public function getAuthUrl(); }
再來看看控制器的主要方法,比如回呼地址是跳轉到控制器 http://www.example.com/sso/check?ticket=xxxx,代碼如下
/** * 檢測是否單點登錄 * @return bool|string */ public function actionCheck() { $ticket = Yii::$app->getRequest()->get('ticket'); if (!$ticket) { return $this->renderAuthError('請先授權', sprintf('<a href="https://www.cnblogs.com/zxf100/archive/2020/12/16/%s">點擊登錄單點登錄系統</a>', SSOlogin::getInstance()->getAuthUrl())); } $userInfo = SSOlogin::getInstance()->getInfoFromTicket($ticket); if (empty($userInfo['username'])) { return $this->renderAuthError('請先授權', sprintf('<a href="https://www.cnblogs.com/zxf100/archive/2020/12/16/%s">點擊登錄單點登錄系統</a>', SSOlogin::getInstance()->getAuthUrl())); } $username = $this->getUserName($userInfo['username']); $user = User::find()->canLogin()->username($username)->one(); if (!$user) { $newUser = []; $newUser['username'] = $userInfo['username']; $newUser['email'] = $this->getUserName($userInfo['username']); $newUser['role'] = User::ROLE_DEV; $newUser['is_email_verified'] = 1; $newUser['realname'] = $userInfo['truename']; $user = $this->addUser($newUser); } $isLogin = Yii::$app->user->login($user, 3600 * 24 * 30); if ($isLogin) { $this->redirect('/task/index'); } return true; }
大概看看這個控制器邏輯就明白了,SSO 介面起到的作用就是獲取用戶資訊,拿這個用戶資訊跟系統用戶表對比,存在用戶則進行登錄,不存在創建用戶并登錄,
這是一個內部的單點系統,集成到后臺,可能其他的 SSO 跟這不太一樣,但基本原理程序差不多,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/235889.html
標籤:其他
