FuelPHP SimpleAuthを拡張して複数テーブルでのログイン認証

FuelPHPで複数のログイン認証を実装

概要

この記事では、複数のログイン機能を実装する方法を紹介しています。
また、これらは別々のテーブルにアカウント情報をもっているものとします。

FuelPHPのauthパッケージには、SimpleAuthという認証を行うためのモジュールがあります。
今回は、このSimpleAuthを拡張して対応していきます。

実装手順

アカウント用テーブル作成

今回は、adminsとbasesの2つのアカウントテーブルを作成します。
SimpleAuthでは、下記の構成で作成することを推奨しています。

SimpleAuthに合わせて同じように作成します。


CREATE TABLE `admins` (
    `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
    `username` VARCHAR( 50 ) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL ,
    `password` VARCHAR( 255 ) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL ,
    `group` INT NOT NULL DEFAULT 1 ,
    `email` VARCHAR( 255 ) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL ,
    `last_login` VARCHAR( 25 ) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL ,
    `login_hash` VARCHAR( 255 ) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL ,
    `profile_fields` TEXT CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL ,
    `created_at` INT( 11 ) UNSIGNED NOT NULL ,
    UNIQUE (
        `username` ,
        `email`
    )
)

CREATE TABLE `bases` (
    `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
    `username` VARCHAR( 50 ) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL ,
    `password` VARCHAR( 255 ) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL ,
    `group` INT NOT NULL DEFAULT 1 ,
    `email` VARCHAR( 255 ) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL ,
    `last_login` VARCHAR( 25 ) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL ,
    `login_hash` VARCHAR( 255 ) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL ,
    `profile_fields` TEXT CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL ,
    `created_at` INT( 11 ) UNSIGNED NOT NULL ,
    UNIQUE (
        `username` ,
        `email`
    )
)

config/config.phpの変更

fuel/app/config/config.phpを変更します。
packagesでauthをコメントアウトしましょう。


'packages'  => array(
	'auth'
),

config/auth.phpの作成

auth.phpを追加します。
「fuel/packages/auth/config/auth.php」を「fuel/app/config/」以下にコピーしてください。
そして、以下のように修正します。

ドライバは、AdminauthとBaseauthの二つを記述してください。
saltは、パスワードをハッシュ化するときに使用するので、任意の文字列を設定しましょう。


return array(
	'driver' => array('Adminauth','Baseauth'),
	'verify_multiple_logins' => false,
	'salt' => 'fsjakl32K2inj9La',
	'iterations' => 10000,
);

config/simpleauth.phpをコピー

fuel/packages/auth/config/simpleauth.phpを以下にそれぞれコピーしてリネームします。
「fuel/app/config/adminauth.php」
「fuel/app/config/baseauth.php」

以下のように「table_name」の値を書きかえます。
adminauth.phpでは、「admins」、baseauth.phpでは、「bases」ですね。


'table_name' => 'admins',

また、「login_hash_salt」の値も任意の文字列に変更してください。

login、group、aclの追加

ここからはパッケージを変更していきます。
authパッケージには、acl、group、loginの3種類あり、これらを拡張します。

パッケージって普通は手を加えずに利用するものですよね。。。
ここを変更するのはとても抵抗があります。
でも変更するしかないのです。

fuel/packages/auth/classes/auth/login/simpleauth.phpをコピーして、同じ階層にadminauth.php、baseauth.phpを作成します。
それぞれファイルを編集して、「Simple」を「Admin」(Base)へ、「simple」を「amin」(base)へ置換します。
大文字・小文字を区別することに注意してください。

また、ここではsession名を変更する必要があります。
「¥Session」などで検索し、「username」「login_hash」などを「admin_username」(base_username)「admin_login_hash」(base_login_hash)に変更しましょう。

作成したテーブルと、Simpleauthで推奨されたテーブルの構造が異なる場合、このファイルを変更します。
例えば、adminsテーブルに「email」のカラムが無い場合は、adminauth.phpを編集して以下の箇所をコメントアウトします。


//validate_user メソッド
//->or_where('email', '=', $username_or_email)

//create_user メソッド
//->or_where('email', '=', $email)

複数端末から同じIDを使用してログインを行う場合は以下のように変更してください。
通常では、1つのIDを使用して複数端末から同時ログインができません。


public function create_login_hash()
{
	if (empty($this->user))
	{
		throw new ¥SimpleUserUpdateException('User not logged in, can¥'t create login hash.', 10);
	}

	$last_login = ¥Date::forge()->get_timestamp();
	//$login_hash = sha1(¥Config::get('simpleauth.login_hash_salt').$this->user['username'].$last_login);
	$login_hash = sha1(¥Config::get('simpleauth.login_hash_salt').$this->user['username']);	//.$last_login を削除

次に、fuel/packages/auth/classes/auth/group/simplegroup.phpをコピーして、同じ階層にadmingroup.php、basegroup.phpを作成します。
それぞれファイルを編集して、「Simple」を「Admin」(Base)へ、「simple」を「amin」(base)へ置換します。

fuel/packages/auth/classes/auth/acl/simpleacl.phpをコピーして、同じ階層にadminacl.php、baseacl.phpを作成します。
それぞれファイルを編集して、「Simple」を「Admin」(Base)へ、「simple」を「amin」(base)へ置換します。

fuel/packages/auth/bootstrap.phpの変更

先ほど追加した、auth・group・aclのファイルを読込むように設定します。
fuel/packages/auth/bootstrap.phpに以下を追記してください。


'Auth\\Auth_Login_Adminauth'         => __DIR__.'/classes/auth/login/adminauth.php',
'Auth\\Auth_Group_Admingroup'       => __DIR__.'/classes/auth/group/admingroup.php',
'Auth\\Auth_Acl_Adminacl'           => __DIR__.'/classes/auth/acl/adminacl.php',

'Auth\\Auth_Login_Baseauth'          => __DIR__.'/classes/auth/login/baseauth.php',
'Auth\\Auth_Group_Basegroup'       => __DIR__.'/classes/auth/group/basegroup.php',
'Auth\\Auth_Acl_Baseacl'           => __DIR__.'/classes/auth/acl/baseacl.php',
Related

Vagrant+Docker+PHP環境で「session.save_path」指定時に、セッションファイルが空になるエラー

ファイル共有でのフォルダの所有者を設定 結論 PHP5.4.28 からセッションファイルのownerはrootもしくはWebサーバのユーザに限るという制限が...

LINEと連携したテイクアウト事前注文システム徹底比較!

目次 テイクアウト予約・注文受付システムのトレンド LINEと連携したテイクアウト事前注文システムの価格表 L.B.B.Cloud テイクイーツ ...

PHPで動画の撮影日を取得

PHPで動画の撮影日を取得 概要 PHPからffprobeコマンドを実行し、動画の撮影日時を取得します。 コード $posted_at = ...

FullCalendarでGoogleカレンダーのようなUIを実装

jQueryプラグインFullCalendarのサンプル 概要 FullCalendarを使用して、GoogleカレンダーのようなUIを実装する使用例を...

PHP Laravel5.2でmulti-auth(複数テーブルでの認証)を実装

Laravel5.2でマルチ認証 概要 LaravelとはPHPの中で今最も伸びているフレームワークです。 処理速度が遅いなどありますが、かなり使い安く拡...

PHP 正規表現でIPアドレス形式の文字列か判定

正規表現でIPアドレスの入力チェック 概要 フォームで入力されたIPアドレスが正当な文字列か判定するためのバリデーション処理を実装します。 基本的...
トップへ戻る