PHPのアカウント管理ライブラリ、phpUserClassを使ってみた

どうも、うしねずみです。

PHPのアカウント管理やログイン、ログオフ管理に便利なライブラリのphpUserClassというものを使ってみました。
こちらでダウンロードできます。
http://phpuserclass.com/

PHPとMySQLを使って、アカウントの作成、アクティベーション、ログイン処理、ログアウト処理などアカウント管理に関することが簡単にできるようになっています。access.class.phpというファイルの中に一つだけクラスが定義されていて、このクラスのメンバ関数を使ってログイン、ログアウトなど、いろんな処理をします。関数名も分かりやすくつけられているので、使い方が分からなくなることもあまりないかも。
使うときは以下のような流れで使うことになります。

MySQLに必要なテーブルを作る

これは簡単です。ダウンロードして解凍したphpUserClassのフォルダの中にある「example2.php」というファイルの先頭に、そのテーブルを作るために必要なSQL文がコメントで書いてあります。こんな感じで。

 CREATE TABLE `users` (
 `userID` mediumint(8) unsigned NOT NULL auto_increment,
 `username` varchar(50) NOT NULL default '',
 `password` varchar(100) NOT NULL default '',
 `email` varchar(150) NOT NULL default '',
 `active` tinyint(1) NOT NULL default '0',
 PRIMARY KEY  (`userID`),
 UNIQUE KEY `username` (`username`),
 UNIQUE KEY `email` (`email`),
 KEY `active` (`active`)
 ) ENGINE=MyISAM  DEFAULT CHARSET=utf8;

このSQL文を実行するだけで必要なテーブルが作成されます。ここでは、「account_data」というDBでこのSQL文を実行して「users」というテーブルを作成したとして、以下の説明を進めていきます。

アカウント作成

アカウントの作成は以下のようにします。

require_once 'access.class.php';
$dbConnection = mysql_connect('localhost', 'root');
$settings = array('dbName' => 'account_data');
mysql_select_db('account_data', $dbConnection);
$user = new flexibleAccess($dbConnection, $settings);

$data = array(
'username' => $_POST['username'],
'email' => $_POST['email'],
'password' => $_POST['pwd'],
'active' => 1
);
$userID = $user->insertUser($data);
//The method returns the userID of the new user or 0 if the user is not added
if ($userID==0)
    echo 'User not registered';//user is allready registered or something like that
else
    echo 'User registered with user id '.$userID;

このコードの五行目までは全てのページに書かなければいけないおまじないです。一行目はphpUserClassのファイルの読み込み。二行目はMySQLに接続する処理。第一引数はMySQLのユーザ名で、第二引数はMySQLのパスワードです。第一引数はサーバ名で、第二引数はMySQLのアカウント名です。三行目はアカウント情報が格納されているDBを指定するオプションを付けています。先程説明したとおり「account_data」というDBであるとします。四行目ではMySQLを実際にそのDBに切り替えておきます。五行目はphpUserClassが提供するクラスであるflexibleAccessというクラスをnewします。

ここで作られた$userというオブジェクトのメンバ関数を呼ぶことでいろんな処理を実現します。例えばアカウントを作るときは13行目のように$userのinsertUserメソッドを呼びます。引数には必要な情報を格納した連想配列。activeというのはアカウントを作成と同時にアクティブにするか、それとも仮登録メールを送信して、それに書かれたリンクをユーザがクリックした後にアクティブにするかを指定します。1を入れておくと、メール送信は行わず、作成と同時にアクティベートされます。連想配列に入れたデータのサニタイズはphpUserClassが内部的にやってくれるので全く気にする必要はありません。楽ちんですね。さらにパスワードもsha1かmd5を使って(デフォルトではsha1)暗号化(?)して保存されます。

ログイン

次はすでにアカウントを作った人がログインする処理です。
これも比較的簡単。まず先頭五行におまじないを書きます。次に$userのloginメソッドを呼びます。これでだけです。第一引数はユーザ名。第二引数はパスワード。第三引数はログイン画面でよく見る「次回から自動的にログインする」っていうチェックマークに相当すると思います(たぶん)。

require_once 'access.class.php';
$dbConnection = mysql_connect('localhost', 'root');
$settings = array('dbName' => 'account_data');
mysql_select_db('account_data', $dbConnection);
$user = new flexibleAccess($dbConnection, $settings);

if ( !$user->login($_POST['uname'],$_POST['pwd'],$_POST['remember'] )){
//Mention that we dont have to use addslashes as the class do the job
    echo 'Wrong username and/or password';
} else {
//user is now loaded
//ログイン後の処理
    header('Location: main.php'); // たとえばメインページにリダイレクト
}

ログインチェック

で、実際そのページに飛んできた人がログインしているかどうかはどうやって確かめるかと言うと、これも簡単。以下のようにします。

require_once 'access.class.php';
$dbConnection = mysql_connect('localhost', 'root');
$settings = array('dbName' => 'account_data');
mysql_select_db('account_data', $dbConnection);
$user = new flexibleAccess($dbConnection, $settings);

if ( $user->is_loaded() ){
    echo 'OK';
} else {
    echo 'NG';
}

先頭五行目までは例のごとくおまじない。そして$userのis_loadedメソッドを呼んで、trueが返ってきたらログイン済みのちゃんとしたユーザです。簡単ですよね?

さて、ここで不思議に思った人もいるかもしれません。なぜなら、ログインしているかどうかをチェックしているはずなのに、ユーザ名とか一切指定していないですね。セッション管理のコードを自前で書いたことがある人なら、session_start関数が呼ばれていないことも気になるかもしれません。でも、そこは一切気にしない。全部phpUserClassにお任せ。

実はphpUserClassの中でsession_start関数が呼ばれていて、セッション変数としてユーザ名を持っているため、現在のユーザが誰かとかは全く気にすることなくログインチェックができるのです。便利っすね、ホント。
ちなみにユーザ名が知りたいときは以下のようにします。

$user->get_property('username');

ログアウト

これも簡単。以下のようにするだけ。logoutメソッドの引数は、ログアウト処理後のリダイレクト先です。

require_once 'access.class.php';
$dbConnection = mysql_connect('localhost', 'root');
$settings = array('dbName' => 'login_data');
mysql_select_db('account_data', $dbConnection);
$user = new flexibleAccess($dbConnection, $settings);

$user->logout('http://www.usinezumi.com/hoge.php');

まとめ

いやー、簡単です!!
やり方は詳しく見てませんがアクティベーション処理もできるようです。アクティベーション処理というのは、アカウント登録のときにメールアドレスを入れると、そのメールアドレス宛てに仮登録メールが送られてきて、そのリンクをクリックした時点で初めてアカウントを有効にするっていう、よくあるアレ。設定をちゃんとやるとメールを自動で送ってアクティベーション処理までやってくれるという。すごいっすね。ログアウト処理時にセッション変数を空にしたりとかセキュリティにも気を使われているようで安心です(私はあんまり詳しくないですが)。
どんどん活用させて頂きます!