用PHP實現SSO單點登陸系統接入功能與分析

SSO英文全稱Single Sign On,單點登陸。SSO是在多個應用系統中,用戶只須要登陸一次就能夠訪問全部相互信任的應用系統。它包括能夠將此次主要的登陸映射到其餘應用中用於同一個用戶的登陸的機制。它是目前比較流行的企業業務整合的解決方案之一,下面咱們來看看吧。app

簡單講一下 SSO 單點登陸系統的接入的原理,前提是系統自己有完善的用戶認證功能,即基本的用戶登陸功能,那實現起來就很方便了。this

SSO 登陸請求接口每每是接口加上一個回調地址,訪問這個地址會跳轉到回調地址並帶上一個 ticket 參數,拿着這個 ticket 參數再請求接口能夠獲取到用戶信息,若是存在用戶則自動登陸,不存在就新增用戶並登陸。url

好比這個 SSO 模型實現了兩個方法,一個是獲取接口 url,一個是憑 ticket 獲取用戶信息:spa

interface SSOLogin
{
  /**
   * 獲取登陸用戶信息
   * @param $ticket
   * @return mixed
   */
  public function getInfoFromTicket($ticket);
  /**
   * 單點登陸受權地址
   * @return mixed
   */
  public function getAuthUrl();
}

再來看看控制器的主要方法,好比回調地址是跳轉到控制器 http://www.example.com/sso/check?ticket=xxxx,代碼以下code

/**
 * 檢測是否單點登陸
 * @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 (empty($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');
  }

  return true;
}

大概看看這個控制器邏輯就明白了。SSO 接口起到的做用就是獲取用戶信息,拿這個用戶信息跟系統用戶表對比,存在用戶則進行登陸,不存在建立用戶並登陸。blog

這是一個內部的單點系統,集成到後臺,可能其餘的 SSO 跟這不太同樣,但基本原理過程差很少。接口

相關文章
相關標籤/搜索