本当にスマートなセッションと認証

こんにちは 「スマートセッション」のトピックに関する記事を見たので、提案されたものをすべての点で上回る、本当にスマートなスキームを共有することにしました。



挑戦する

「すべてのコンピューターでログアウトする」オプションを使用して、ユーザーセッションと認証の最適なシステムを実装します。 システムをクラッシュ(memcachedの再起動)から保護し、メモリを効率的に使用します。





実装



1.ストレージのラッパーを作成する必要があります(コード番号1を参照)。 コードをシステムに適合させる必要があります(たとえば、memcacheオブジェクトへのパスを指定します)。



2. $ session-> start()を使用します。 セッションに本当にアクセスする必要がある場合にのみ(たとえば、承認コントローラーで)。 セッションIDを取得するには、$ session-> getId()を使用します。



3.認証するには、DBMSにテーブルを入力します(コードNo. 2を参照)。 セッション識別子とそれに対応するユーザーIDを保存します。 認証データが正常に入力された場合、対応する行をテーブルに挿入し、キー「al」を追加する必要があります=> memcached。

特定のユーザーがページにアクセスする場合、$ session-> getId()を要求する必要があります。文字列が返される場合は、対応するmemcachedを最初に確認し、見つからない場合はauthsessionsテーブルを要求(およびmemcachedに挿入)して、受信したUIDを次のように使用しますそのような。

「すべてのコンピューターでログアウト」ボタンをクリックすると、そのようなUIDを使用してテーブルからすべての認証セッションを照会し、最初にDBMSから削除し、次にmemcachedから削除する必要があります。



コード番号1:

<?php

$session = new session;

class session

{

public $lifeTime = 86400;

public $started = FALSE;

public function __construct ()

{

ini_set( 'session.cookie_lifetime' ,157680000);

ini_set( 'session.cookie_domain' ,COOKDOMAIN);

ini_set( 'session.name' ,COOKPREFIX. 'sid' );

ini_set( 'session.use_trans_sid' ,0);

ini_set( 'session.use_cookies' ,1);

}

public function getId()

{

$sn = ini_get( 'session.name' );

if (isset($_REQUEST[$sn])) { return gpcvar_str($_REQUEST[$sn]);}

if (isset($_COOKIE[$sn])) { return gpcvar_str($_COOKIE[$sn]);}

$ this ->start();

return session_id();

}

public function start()

{

if ($ this ->started) { return ;}

$ this ->started = TRUE;

$sn = ini_get( 'session.name' );

session_set_save_handler(array($ this , 'open' ),array($ this , 'close' ),array($ this , 'read' ),array($ this , 'write' ),array($ this , 'destroy' ),array($ this , 'gc' ));

if (isset($_REQUEST[$sn])) {$_COOKIE[$sn] = gpcvar_str($_REQUEST[$sn]);}

session_start();

}

public function session_write_close() { return TRUE;}

public function open($savePath,$sessName) { return TRUE;}

public function close() { return TRUE;}

public function read($sessID) { return xE::$memcache-> get ( 'sess.' .$sessID);}

public function write($sessID,$sessData) { return xE::$memcache-> set ( 'sess.' .$sessID,$sessData,$ this ->lifeTime);}

public function destroy($sessID) { return xE::$memcache->delete( 'sess.' .$sessID);}

public function gc($lt) { return TRUE;}

}

function gpcvar_str(&$ var ) { if (is_array($ var )) { return '' ;} return strval($ var );}




* This source code was highlighted with Source Code Highlighter .








コード番号2:

CREATE TABLE `xE_authsessions` (

`session_id` char (32) CHARACTER SET ascii COLLATE ascii_bin NOT NULL ,

`uid` int (11) NOT NULL ,

`ip` int (10) unsigned NOT NULL ,

`ctime` int (11) NOT NULL ,

PRIMARY KEY (`session_id`),

KEY `uid` (`uid`)

) ENGINE=InnoDB;



* This source code was highlighted with Source Code Highlighter .







All Articles