세션정보를 DB에 넣고 중복로그인 막고 사이트 통합로그인
작성자 : 김영철
등록날짜 : 2009.01.13 23:02
안녕하세요..
세션구울 때 DB를 사용합니다. 그리고 중복로그인을 막고, 2차도메인을 사용하는 사이트에서 통합로그인이 가능토록한 소스입니다.
늘 행복하세요!
====== 아래부터 소스입니다. ==============
<?php
//!! 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();
중복 로그인 부분 찾느라 힘드신 분들 많으시져..
저도 찾다가 못찼았지만..(asp는요)제가 지금 올릴건 죄송하지만 php입니다..
보시고 많은분들이 도움이 되셨음 하구요..
이걸 보시고 asp로 구현 가능하신분은 소스좀 올려 주셨으면 하네요..(부탁입니다. ^^v)
수고들 하세요...
아참 그리고 이글은 저도 퍼온 글입니다.
DB클래스는 넣지 않습니다. 참고정도 하시라고 공개합니다. 여기 게시판에서 팁도 좀 얻었습니다. 잘 보시고 응용해 보세요!
세션구울 때 DB를 사용합니다. 그리고 중복로그인을 막고, 2차도메인을 사용하는 사이트에서 통합로그인이 가능토록한 소스입니다.
늘 행복하세요!
====== 아래부터 소스입니다. ==============
<?php
//!! 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();
[출처] 락
"쇼핑몰·홈페이지·오픈마켓
블로그·페이스북·이메일 등의 각종 마케팅 글쓰기, 각종 광고, 영업, 판매, 제안서, 전단지 반응율 3배×10배 이상 높이는 마법의 8단계 공식" |
☞자세히보기 |
|
|