用CAS實現discuz7單點登錄
最近一個項目,用兩種語言完成,會員部分和相冊是jsp,其他的部分是discuz7+ucenter1.5+uchome2+ecmall2,php的。不同系統不同語言,同步登錄問題就擺在眼前了。要求用jsp部分的會員信息作爲登錄信息。實現方案是採用CAS。php部分的幾個系統有ucenter來實現登錄整合,當前的問題是PHP與jsp之間的登錄整合。服務器端CAS安裝網上很多介紹,CAS的PHP端用PHPCAS。下面介紹discuz的代碼改造
其實也很簡單。找到discuz的logging.php 這個是登陸入口,在第二行插入
define('CAS_ENABLE', true);
define('CAS_SERVER_HOSTNAME', "CAS服務器地址");
define('CAS_SERVER_PORT', 80);
define('CAS_SERVER_APP_NAME', "CAS驗證入口");
require_once("CAS.php");
phpCAS::client(CAS_VERSION_2_0, CAS_SERVER_HOSTNAME, CAS_SERVER_PORT, CAS_SERVER_APP_NAME);
phpCAS::setNoCasServerValidation();
phpCAS::forceAuthentication();
if($action<>'logout'){
unset($_COOKIE);
$action='login';
$username = phpCAS::getUser();
$password = '';
$loginsubmit='yes';
$cookietime="2592000";
$allowsynlogin = 1;
}
找到這行showmessage('logout_succeed', dreferer()); 在它上面加入
phpCAS::logout();
之後找到uc_client /control目錄下的user.php 註釋掉第123行開始的
elseif($user['password'] != md5($passwordmd5.$user['salt'])) {
$status = -2;
} elseif($checkques && $user['secques'] != '' && $user['secques'] != $_ENV['user']->quescrypt($questionid, $answer)) {
$status = -3;
}
找到uc_client /model目錄下的user.php ,註釋掉第100行開始的
elseif($user['password'] != md5(md5($password).$user['salt'])) {
return -2;}
代碼改造結束,這樣discuz利用CAS登錄後返回的用戶名進行登錄。沒有用密碼做ucenter同步登陸,可能不太安全,其實也可以從CAS取得用戶名的同時再申請取得密碼給$password,這樣的話就不需要修改uc_client 目錄下的兩個user.php文件了。推薦還是從CAS同時取得密碼,這樣安全些。
至此discuz不但能通過CAS實現與其他系統的同步登陸,同時能夠實現同過ucenter同步登陸康盛系列產品。(本文僅供學習參考,本人不對修改源程序產生的一切問題負責)