この記事では、複数のログイン機能を実装する方法を紹介しています。
また、これらは別々のテーブルにアカウント情報をもっているものとします。
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`
)
)
fuel/app/config/config.phpを変更します。
packagesでauthをコメントアウトしましょう。
'packages' => array(
'auth'
),
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,
);
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」の値も任意の文字列に変更してください。
ここからはパッケージを変更していきます。
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)へ置換します。
先ほど追加した、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',