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

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

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

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

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

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

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

rbenv環境でRuby on Railsのアプリケーションを一瞬で自動生成

アプリケーション構築時に最初に行う手順 概要 アプリケーションを作成するまでの手順を記載しています。 rbenvなどの環境が設定済と仮定して話を進めま...

Rails devise・authority・rolifyで権限付きの認証機能

devise・authority・rolify 概要 3つのGemを使用して、権限付き認証機能を実装します。 gem インストール Gemfile ...

Rails devise で複数モデルの認証機能を実装

Rails devise で複数モデルを管理 概要 rails のログイン認証 Gem「devise」のインストール・設定方法を紹介します。 よく「d...
トップへ戻る