owncloud源碼分析5--CAS單點登陸

CAS單點登陸
1、將CAS的包放到lib\private下面方便引用,如圖


2、引入到\owncloud\lib\base.php的976行中的handleLogin()方法,將這個方法的內容改爲下面的內容:
if(!$_REQUEST['logout']) { OC_App::loadApps(array('prelogin')); } //引入cas類庫 require_once 'private\CAS.php';
phpCAS::setDebug();

// 初始化client
phpCAS::client(CAS_VERSION_2_0, '*******', 8080, '/sso');


// 若是sso服務器是https方式的,那麼須要配置信任證書。若是是http的方式,那麼註釋掉此項
// phpCAS::setCasServerCACert('AdminCA1.crt');
phpCAS::setNoCasServerValidation();

// 若是須要用戶映射,那麼須要設置serverCode,若是不須要能夠註釋掉
// phpCAS::setServerCode('pt.jcsj');

//處理單點退出請求,第一個參數爲false,即爲不進行客戶端驗證
phpCAS::handleLogoutRequests(false, false);

// phpCAS::setNoCasServerValidation();

// 進行認證
phpCAS::forceAuthentication();

if (isset($_REQUEST['logout'])) {
   phpCAS::logout();
   die;
   //header("Location: " . OC::$WEBROOT.(empty(OC::$WEBROOT) ? '/' : ''));
}
// logout if desired
//將下面的值存儲到session對象中,若是存在phpCAS的user用戶則執行本地登陸
//print_r(phpCAS::getAttributes());die;
if(phpCAS::getUser()) {
   if (OC_User::login(phpCAS::getUser())) {
      $userId = OC_User::getUser();
      // setting up the time zone
      if (isset($_POST['timezone-offset'])) {
         self::$server->getSession()->set('timezone', $_POST['timezone-offset']);
         self::$server->getConfig()->setUserValue($userId, 'core', 'timezone', $_POST['timezone']);
      }

      self::cleanupLoginTokens($userId);
      if (!empty($_POST["remember_login"])) {
         if (defined("DEBUG") && DEBUG) {
            self::$server->getLogger()->debug('Setting remember login to cookie', array('app' => 'core'));
         }
         $token = \OC::$server->getSecureRandom()->getMediumStrengthGenerator()->generate(32);
         self::$server->getConfig()->setUserValue($userId, 'login_token', $token, time());
         OC_User::setMagicInCookie($userId, $token);
      } else {
         OC_User::unsetMagicInCookie();
      }
      OC_Util::redirectToDefaultPage();
      exit();
   }
}
還要修改\owncloud\lib\private\user\database.php中的checkPassword方法(158行),改爲:
$query = OC_DB::prepare('SELECT `uid`, `password` FROM `*PREFIX*users` WHERE LOWER(`uid`) = LOWER(?)');
$result = $query->execute(array($uid));
$row = $result->fetchRow();
if ($row) {
   //直接返回查詢的信息
   /*$storedHash = $row['password'];
   $newHash = '';
   if (\OC::$server->getHasher()->verify($password, $storedHash, $newHash)) {
      if (!empty($newHash)) {
         $this->setPassword($uid, $password);
      }*/
      return $row['uid'];

   //}
}else{
   return false;
}

return false;

OVER!!
相關文章
相關標籤/搜索