CAS Single Sign-On
1. 그림과 같이 CAS 패키지를 libprivate 아래에 배치합니다.
2. owncloudlibbase.php의 976번째 줄에 handleLogin() 메서드를 도입하고 이 메서드의 내용을 다음과 같이 변경합니다.
<span>if(!$_REQUEST['logout']) { OC_App::loadApps(array('prelogin')); } //引入cas类库 require_once 'private\CAS.php';</span>
<pre class="brush:php;toolbar:false"><span>phpCAS::setDebug(); // 初始化client phpCAS::client(CAS_VERSION_2_0, '192.168.6.101', 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(); } }</span>또한 owncloudlibprivateuserdatabase.php의 checkPassword 메서드(158행)를 다음과 같이 수정합니다.
<pre class="brush:php;toolbar:false"><span>$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;</span>
저작권 안내: 이 글은 해당 블로거의 원본 글이므로 블로거의 허락 없이 복제할 수 없습니다.
위 내용은 owncloud 소스 코드 분석 5-CAS Single Sign-On 내용을 포함하여 PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되기를 바랍니다.