首頁  >  文章  >  php教程  >  php實作的SSO單一登入系統存取功能範例分析

php實作的SSO單一登入系統存取功能範例分析

高洛峰
高洛峰原創
2016-12-28 16:07:012319瀏覽

本文實例講述了php實現的SSO單一登入系統存取功能。分享給大家參考,具體如下:

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(&#39;请先授权&#39;, sprintf(&#39;<a href="%s">点击登录单点登录系统</a>&#39;, SSOlogin::getInstance()->getAuthUrl()));
  }
  $userInfo = SSOlogin::getInstance()->getInfoFromTicket($ticket);
  if (empty($userInfo[&#39;username&#39;])) {
    return $this->renderAuthError(&#39;请先授权&#39;, sprintf(&#39;<a href="%s">点击登录单点登录系统</a>&#39;, SSOlogin::getInstance()->getAuthUrl()));
  }
  $username = $this->getUserName($userInfo[&#39;username&#39;]);
  $user = User::find()->canLogin()->username($username)->one();
  if (!$user) {
    $newUser = [];
    $newUser[&#39;username&#39;] = $userInfo[&#39;username&#39;];
    $newUser[&#39;email&#39;] = $this->getUserName($userInfo[&#39;username&#39;]);
    $newUser[&#39;role&#39;] = User::ROLE_DEV;
    $newUser[&#39;is_email_verified&#39;] = 1;
    $newUser[&#39;realname&#39;] = $userInfo[&#39;truename&#39;];
    $user = $this->addUser($newUser);
  }
  $isLogin = Yii::$app->user->login($user, 3600 * 24 * 30);
  if ($isLogin) {
    $this->redirect(&#39;/task/index&#39;);
  }
  return true;
}

大概看看這個控制器邏輯就懂了。 SSO 介面扮演的角色就是取得使用者資訊,拿這個使用者資訊跟系統使用者表對比,存在使用者則進行登錄,不存在建立使用者並登入。

這是一個內部的單點系統,整合到後台,可能其他的 SSO 跟這不太一樣,但基本原理過程差不多。

希望本文所述對大家PHP程式設計有所幫助。

更多php實現的SSO單一登入系統存取功能範例分析相關文章請關注PHP中文網!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn