シングルサインオン

提供: GeeklogJpWiki

シングルサインオンとは 他システムユーザは,他システムにログインすることで,マイブログを開設でき,自動的にユーザID2のユーザアカウントを取得し,その際マイブログを表示すると,自動的にRoot管理者としてログインします。 ブログ開設者はマイブログに直接ログインすると,逆に,他システムにも自動ログインします。 他システム自動ログインを行う箇所 以下のように,すべてのページでシングルサインオンチェックを行っています。

lib-common.php:

/** 他システム自動ログインを行う
275: * for 他システム AutoLogin
276: *
277: */
278: require_once( $_CONF['path_system'] . 'custom/custom_othersystem_autologin.php' );

なお,278行目をコメントアウトすることで,自動ログインを行わず,単独でログインできるようになります。 top,default,documentでは,278行目をコメントアウトして他システム自動ログインを 無効化しており,他システムにログインしていなくても,単独にログインできます。 自動ログインは,カスタム関数(system/custom/下の関数)で記述しています。


custom_othersystem_autologin.php:

<?php

if($他システム_path[2] != 'users.php'){
	include_once( $_CONF['path_system'] . 'cfclass_othersystemsession.php');
	include_once( $_CONF['path_system'] . 'include.php');
	
	#初期化
	$clsubgss = new 他システムSession($INIT['session']['main'], $_COOKIE, $FORM);
	#セッションチェック
	if( $clsubgss->SessionCheck() ){
		// 他システムにログインしていた。
		if(!empty($_USER['username'])){
			// 他システムにログインしていてGeeklogにもログインしていた。
			if($_USER['username']==$clsubgss->userdata['uus_loginid']){
				// 他システムとGeeklogのログインIDが一致した。
				// 正常 にログインできている状態なのでなにもしない。
			} else {
				// 他システムとGeeklogのログインIDが一致しなかった。
				// 他のサイトを訪れたときなど?
			}
		} else {
			$GeeklogAdminName = DB_getItem ($_TABLES['users'], 'username', "uid = 2");
			// Geeklogにログインしていなかった。
			if($GeeklogAdminName == $clsubgss->userdata['uus_loginid']){
				// 他システムにログインしているアカウントと訪問したサイトの管理者の	username が
				// 一致した場合は自動ログインを試みる。
				$_POST['loginname']=$clsubgss->userdata['uus_loginid'];
				$_POST['passwd']   =$clsubgss->userdata['uus_loginpw'];
				$_SESSION['othersystem_blogsns']=$_POST;
				header('Location: ' . $_CONF['site_url'] . "/users.php?mode=login");
			}
		}
	}else{
		// 他システムにログインしていなかった。
		if(!empty($_USER['uid']) && $_USER['uid']==2){
			// 他システムにログインしていないのに管理者としてGeeklogにログインしていた。
			require_once ($_CONF['path_system'] . 'lib-user.php');
			
			#ログアウト
			$clsubgss->Logout();
			SESS_endUserSession ($_USER['uid']);
			PLG_logoutUser ($_USER['uid']);
			setcookie ($_CONF['cookie_session'], '', time() - 10000,
			$_CONF['cookie_path'], $_CONF['cookiedomain'],
			$_CONF['cookiesecure']);
			setcookie ($_CONF['cookie_password'], '', time() - 10000,
			$_CONF['cookie_path'], $_CONF['cookiedomain'],
			$_CONF['cookiesecure']);
			setcookie ($_CONF['cookie_name'], '', time() - 10000,
			$_CONF['cookie_path'], $_CONF['cookiedomain'],
			$_CONF['cookiesecure']);
			// ログオフと同じだけどログオフしましたの表示をしない。
			
			unset($_USER['uid']);
	
			header('Location: ' . $_CONF['site_url'] . "/users.php");
//			header('Location: ' . $_CONF['site_url'] . "/users.php?mode=logoff");
		}
	}
}
?>

user id 2 の特別処理の追加

ブログSNSの機能において,すべてのユーザはパスワードを自由に変更できます。コンフィギュレーションエディタプラグインでの設定によっては,ユーザ名も変更できます。しかしながら,ブロ グ管理者がどちらかでも変更すると,それ以後シングルサインオンができなくなります。その問題を回避するため,user id 2が変更できないよう,Geeklogをハックする必要がでてきました。 1.「マイアカウント」で,変更できないようにする方法 usersettiongs.php の 61行目以後を変更 修正前:

$preferences->set_file (array ('profile' => 'profile.thtml',
'photo' => 'userphoto.thtml',
'username' => 'username.thtml',
'deleteaccount' => 'deleteaccount.thtml'));

修正後:

if ($_USER['uid']==2) {
$preferences->set_file (array ('profile' => 'profile_uid2.thtml',
'photo' => 'userphoto.thtml',
'username' => 'username.thtml',
'deleteaccount' => 'deleteaccount.thtml'));
} else {
$preferences->set_file (array ('profile' => 'profile.thtml',
'photo' => 'userphoto.thtml',
'username' => 'username.thtml',
'deleteaccount' => 'deleteaccount.thtml'));
}

ここであらたに呼ばれているテンプレートを,すべてのテーマに追加します。

/system/template/blogsns/http/blogsns/layout/テーマ/preferences/profile_uid2.thtml

2.ユーザ管理画面でuser id 2がユーザ名・パスワードを変更できないようにする方法

admin/user.php の 186行目以後を変更 修正前:

$user_templates = new Template($_CONF['path_layout'] . 'admin/user');
$user_templates->set_file (array ('form' => 'edituser.thtml',
'groupedit' => 'groupedit.thtml'));

修正後:

	$user_templates = new Template($_CONF['path_layout'] . 'admin/user');
	// For 他システム -->
	// $user_templates->set_file (array ('form' => 'edituser.thtml',
	// 'groupedit' => 'groupedit.thtml'));
	if ($uid==2) {
	$user_templates->set_file (array ('form' => 'edituser_uid2.thtml',
	'groupedit' => 'groupedit.thtml'));
} else {
	$user_templates->set_file (array ('form' => 'edituser.thtml',
	'groupedit' => 'groupedit.thtml'));
}
// For 他システム <--

ここであらたに呼ばれているテンプレートを,すべてのテーマに追加します。 /system/template/blogsns/http/blogsns/layout/テーマ/admin/user/edituser_uid2.thtml Geeklogログインで他システムもログイン 他システムへ対するセッション管理は,プログラムソース ‘html/userid/users.php’ で記述しています。 ‘cfclass_他システムsession.php’,’include.php’はクリエーターズ・ファクトリー様より 頂いた 他システム側のセッション管理用プログラムです。

1.users.php マイブログから他システムへのログイン連携 ユーザID2の管理者がマイブログ(Geeklog)にログインを行った場合,他システムにも自動ログインを行います。

1025 // for 他システム ---->
1026 if( $clsubgss->Login($loginname, $passwd) ){
1027 // echo "ログイン成功、クッキー保存<br>";
1028 }else{
1029 // echo "ログイン失敗<br>";
1030 }
1031 } elseif($clsubgss->SessionCheck()){
1032 // 他システムにログインしていた。
1033 $loginname = $clsubgss->userdata['uus_loginid'];
1034 $passwd = $clsubgss->userdata['uus_loginpw'];
1035 $status = SEC_authenticate($loginname, $passwd, $uid);
1036 // for 他システム <----
1106 // for 他システム ---->
1107 if (strstr ($_SERVER['HTTP_REFERER'], $clsubgss->cookiedomain) === false) {
1108 $display .= COM_refresh ($_SERVER['HTTP_REFERER']);
1109 } else {
1110 $display .= COM_refresh ($_CONF['site_url'] . '/index.php');
1111 }
1112 // for 他システム <----

Geeklogをログアウトで他システムも連動してログアウト ブログSNSを開設した他システムユーザーはGeeklog内部では uidが 2の管理者として登録されているので uidが 2の管理者がGeeklogをログアウトした場合は他システム側の該当するユー ザーもログアウトします。

769 // for 他システム ---->
770 if($_USER['uid']==2){
771 #ログアウト
772 $clsubgss->Logout();
773 }
774 // for 他システム <----

「ログアウト」モードを作成 他システム側とのログイン状態の同期等でGeeklogでのログオフ処理を行うけれど 「ログオフしました」の表示を出さずにindex.phpの画面を出す必要があったので ログオフ処理と同じ内容を 行った後でメッセージを出さずにindex.phpに移動する 「ログアウト」モードを作成しました。

792 // for 他システム ---->
793 case 'logoff':
794 if (!empty ($_USER['uid']) AND $_USER['uid'] > 1) {
795 #ログアウト
796 $clsubgss->Logout();
797 SESS_endUserSession ($_USER['uid']);
798 PLG_logoutUser ($_USER['uid']);
799 }
800 setcookie ($_CONF['cookie_session'], '', time() - 10000,
801 $_CONF['cookie_path'], $_CONF['cookiedomain'],
802 $_CONF['cookiesecure']);
803 setcookie ($_CONF['cookie_password'], '', time() - 10000,
804 $_CONF['cookie_path'], $_CONF['cookiedomain'],
805 $_CONF['cookiesecure']);
806 setcookie ($_CONF['cookie_name'], '', time() - 10000,
807 $_CONF['cookie_path'], $_CONF['cookiedomain'],
808 $_CONF['cookiesecure']);
809
810 // ログオフと同じだけどログオフしましたの表示をしない。
811 $display = COM_refresh($_CONF['site_url'] . '/index.php');
812 break;
813 // for 他システム <----
他システムのセッション情報読み取り
750行目~754行目は他システムでのログインの状況を確認する為他システムのセッション情報を読み取っています。
function defaultform ($msg)
748: // for 他システム ---->
749: #初期化
750: if(!isset($clsubgss)){
751: include_once( $_CONF['path_system'] . 'cfclass_他システムsession.php');
752: include_once( $_CONF['path_system'] . 'include.php');
753: $clsubgss = new 他システムSession($INIT['session']['main'], $_COOKIE, $FORM);
754: }
755: // for 他システム <----

2.include.phpにおける他システム用変更点

system/include.phpはGeeklogでの自動ログイン用に348行目からのデータ取得フィールドを修正しています。
//$INIT['session']['main']['select_sql'] = "uus_cd, uus_nickname, uus_email, date_format(uus_ctdt,'%y/%m/%d') as uus_ctdt, date_format(uus_lastlogindt,'%y/%m/%d') as u
$INIT['session']['main']['select_sql'] = "uus_cd, uus_loginid, uus_loginpw, uus_nickname, uus_email, date_format(uus_ctdt,'%y/%m/%d') as uus_ctdt, date_format(uus_las

3.cfclass_他システムsession.phpにおける他システム用変更点 system/cfclass_othersystem_session.phpでは 502行目、と531行目を修正しています。

function Login( $loginid, $loginpw )
500 if( $this->sstype == "1" ){
501 #クッキーへ保存
502 // setcookie( $this->cookiename, $this->strSessionid, $this->cookietimeout, $this->cookiedir, $this->cookiedomain );
503 setcookie( $this->cookiename, $this->strSessionid, $this->cookietimeout, $this->cookiepath, $this->cookiedomain );
504 }
function Logout()
528 #クッキー管理ONならクッキークリア
529 if( $this->sstype == "1" ){
530 setcookie( $this->cookiename, "", 0, $this->cookiedir, $this->cookiedomain );
531 setcookie( $this->cookiename, "", 0, $this->cookiepath, $this->cookiedomain );
532 }
個人用ツール