簡單講一下 SSO 單點登錄系統的接入的原理,前提是系統本身有完善的用戶認證功能,即基本的用戶登錄功能,那做起來就很方便了。
SSO 登錄請求接口往往是接口加上一個回調地址,訪問這個地址會跳轉到回調地址并帶上一個 ticket 參數,拿著這個 ticket 參數再請求接口可以獲取到用戶信息,如果存在用戶則自動登錄,不存在就新增用戶并登錄。
比如這個 SSO 模型實現了兩個方法,一個是獲取接口 url,一個是憑 ticket 獲取用戶信息:
PHP:
- 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="%s">點擊登錄單點登錄系統</a>', SSOlogin::getInstance()->getAuthUrl()));
- }
- $userInfo = SSOlogin::getInstance()->getInfoFromTicket($ticket);
- if (emptyempty($userInfo['username'])) {
- return $this->renderAuthError('請先授權', sprintf('<a href="%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');
- } //Vevb.com
- return true;
- }
大概看看這個控制器邏輯就明白了。SSO 接口起到的作用就是獲取用戶信息,拿這個用戶信息跟系統用戶表對比,存在用戶則進行登錄,不存在創建用戶并登錄。
這是一個內部的單點系統,集成到后臺,可能其他的 SSO 跟這不太一樣,但基本原理過程差不多。
新聞熱點
疑難解答