세션정보를 DB에 넣고 중복로그인 막고 사이트 통합로그인 하는 소스

DB클래스는 넣지 않습니다. 참고정도 하시라고 공개합니다. 여기 게시판에서 팁도 좀 얻었습니다. 잘 보시고 응용해 보세요!

세션구울 때 DB를 사용합니다. 그리고 중복로그인을 막고, 2차도메인을 사용하는 사이트에서 통합로그인이 가능토록한 소스입니다.

늘 행복하세요!

====== 아래부터 소스입니다. ==============

//!! eZSession DB (세션 DB핸들링 및 통합로그인)
/*

CREATE TABLE “ezsession_session” (
“sesskey” varchar(33) NOT NULL,
“expiry” int4 NOT NULL,
“value” text NOT NULL,
“uid” int4 NOT NULL,
“security” varchar(1) NOT NULL,
“remoteip” varchar(20),
CONSTRAINT “ezsession_session_pkey” PRIMARY KEY (“sesskey”)
);

// start session handling
include_once( “classes/ezsession.php” );

session_set_save_handler (“sess_open”, “sess_close”, “sess_read”, “sess_write”, “sess_destroy”, “sess_gc”);
session_set_cookie_params( 0, “/”, “.ohmytravel.com” );
session_start();
*/

include_once( “classes/ezdb.php” );

$ini =& INIFile::globalINI();
$SesstionTimeOut = 30 * 60;
$maxlifetime = $SesstionTimeOut;

function sess_open( $save_path, $session_name )
{
global $sess_save_path, $sess_session_name;

// $sess_save_path = $save_path;
// $sess_session_name = $session_name;

return true;
}

function sess_close()
{
return true;
}

function sess_read( $key )
{
global $sess_save_path, $sess_session_name;

$db =& eZDB::globalDatabase();

$value_array = array();

$db->array_query( $value_array, “SELECT value FROM ezsession_session WHERE sesskey=’$key’ AND expiry > ” . time() );

if( count( $value_array ) == 1 )
{
// 세션시간이 현재시간보다 크다면 정보를 가져온다.
return $value_array[0][$db->fieldName(“value”)];
}
else
{
$db->query( “DELETE FROM ezsession_session WHERE sesskey=’$key'” );
return false;
}
}

function sess_write( $key, $sess_data )
{
global $sess_save_path, $sess_session_name, $maxlifetime;

$db =& eZDB::globalDatabase();
$ret = false;

$session_array = array();
$check_array = array();

$expiry = time() + $maxlifetime;
$value = addslashes( $sess_data );
$remoteip = $_SERVER[“REMOTE_ADDR”];

// 세션정보가 존재하는지 체크
$db->array_query( $session_array, “SELECT * FROM ezsession_session WHERE sesskey=’$key’ AND value IS NOT NULL” );

if ( count( $session_array ) == 1 ) // 세션업데이트 – DB의 시간이 현재시간보다 크면 계속 시간을 업데이트 시켜 세션을 유지.
{
$res = $db->query( “UPDATE ezsession_session SET expiry=’$expiry’ WHERE sesskey=’$key’ AND expiry > ” . time() );

if( $res == true )
$ret = true;
}
else if ( count( $session_array ) == 0 ) // 세션정보가 없는 경우. DB에 세션을 추가한다.
{
if ( $sess_data )
{
$uid = $GLOBALS[‘ezuser_session_id’];

// 이중 로그인 차단! 흐흐~ 주기넹! 완벽한 중복로그인 차단이얌! ㅋㅋㅋ~
$db->array_query( $check_array, “SELECT value FROM ezsession_session WHERE uid=’$uid’ AND remoteip!=’$remoteip'” );

// 중복로그인을 검사하기 위한 필드. O 정상, X 중복로그인.
$security = “O”;
if ( count( $check_array ) == 1 )
{
$security = “X”;
}

// lock the table
$db->begin();
$db->lock( “ezsession_session” );

// 세션추가 – 로그인했을 경우 $sess_data 정보가 한번 넘어온다. 그 때만 추가한다.
$res = $db->query( “INSERT INTO ezsession_session ( sesskey, expiry, value, uid, security, remoteip ) VALUES ( ‘$key’, ‘$expiry’, ‘$value’, ‘$uid’, ‘$security’, ‘$remoteip’ )” );

if ( $res == true )
$ret = true;
}
}

$db->unlock();

if ( $ret == false )
$db->rollback( );
else
$db->commit();

return $ret;
}

function sess_destroy( $key )
{
global $sess_save_path, $sess_session_name;

$db =& eZDB::globalDatabase();

$db->query( “DELETE FROM ezsession_session WHERE sesskey=’$key'” );

return true;
}

/*********************************************
* WARNING – You will need to implement some *
* sort of garbage collection routine here. *
*********************************************/
function sess_gc( $maxlifetime )
{
$db =& eZDB::globalDatabase();

$db->query( “DELETE FROM ezsession_session WHERE expiry < " . time() ); return true;
}

// 세션 핸들링 (도메인 입력시 1차도메인 앞에 .(점)을 찍어야 한다.)
session_set_save_handler (“sess_open”, “sess_close”, “sess_read”, “sess_write”, “sess_destroy”, “sess_gc”);
session_set_cookie_params( 0, “/”, “.domain.com” );
session_start();