FuelPHPでSimpleAuthを使う場合、 ログインユーザーの情報を保持するためのテーブルが必要です。
mysqlだとIntroduction - SimpleAuth - Auth Package - FuelPHP Documentationに書いてある通り以下のようなテーブルの定義になります。
CREATE TABLE `users` ( `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 DEFAULT 0, `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` ) )
Postgresqlの場合は以下のようになるかと思います。
※テーブルの名前のデフォルトの設定は、usersです。
上記のようにテーブルの名前をかえた場合は、APPPATH/config/simpleauth.phpにテーブルの名前がtest_usersであるという設定を書く必要があります。
※GRANTはTO PUBLICになっていますが、それらしいユーザーを設定しましょう。
※ usernameがVARCHER(50)になっていのますが、多分50文字にこだわる理由はないと思います。50文字をこえるユーザー名を設定するユーザーがいたらそれはそれでどうかなーと思いますが。PostgreSQLではVARCHARを使う理由はない(TEXTで良い)とどこかで見た気がしますので、TEXT型でいいかなーと思います。
ポイントは2つあります。
1. 列名groupは予約語なので、"group"すること
2. login_hashにDEFAULT ''を追加すること
2.でDEFAULTの値を設定しないと、ユーザーの作成の際のINSERTに失敗します。
失敗の要因は「 login_hash」はNOT NULLです、になります。
simpleauth.phpを見ると
ログイン中かを確認
mysqlだとIntroduction - SimpleAuth - Auth Package - FuelPHP Documentationに書いてある通り以下のようなテーブルの定義になります。
CREATE TABLE `users` ( `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 DEFAULT 0, `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` ) )
Postgresqlの場合は以下のようになるかと思います。
CREATE TABLE test_users (
id SERIAL PRIMARY KEY ,
username VARCHAR( 50 ) NOT NULL ,
password VARCHAR( 255 ) NOT NULL ,
"group" INT NOT NULL DEFAULT 1 ,
email VARCHAR( 255 ) NOT NULL ,
last_login VARCHAR( 25 ) NOT NULL DEFAULT 0,
login_hash VARCHAR( 255 ) NOT NULL DEFAULT '',
profile_fields TEXT NOT NULL,
created_at INT NOT NULL ,
UNIQUE (
username ,
email
)
);
GRANT ALL ON test_users TO PUBLIC ;
GRANT ALL ON test_users_id_seq TO PUBLIC ;
※テーブルの名前のデフォルトの設定は、usersです。
上記のようにテーブルの名前をかえた場合は、APPPATH/config/simpleauth.phpにテーブルの名前がtest_usersであるという設定を書く必要があります。
※GRANTはTO PUBLICになっていますが、それらしいユーザーを設定しましょう。
※ usernameがVARCHER(50)になっていのますが、多分50文字にこだわる理由はないと思います。50文字をこえるユーザー名を設定するユーザーがいたらそれはそれでどうかなーと思いますが。PostgreSQLではVARCHARを使う理由はない(TEXTで良い)とどこかで見た気がしますので、TEXT型でいいかなーと思います。
ポイントは2つあります。
1. 列名groupは予約語なので、"group"すること
2. login_hashにDEFAULT ''を追加すること
2.でDEFAULTの値を設定しないと、ユーザーの作成の際のINSERTに失敗します。
失敗の要因は「 login_hash」はNOT NULLです、になります。
simpleauth.phpを見ると
$user = array(
'username' => (string) $username,
'password' => $this->hash_password((string) $password),
'email' => $email,
'group' => (int) $group,
'profile_fields' => serialize($profile_fields),
'created_at' => \Date::forge()->get_timestamp()
);
$result = \DB::insert(\Config::get('simpleauth.table_name'))
->set($user)
->execute(\Config::get('simpleauth.db_connection'));
と書いてあります。
login_hashの列がないので、 login_hashにDEFAULT ''を追加しないと駄目です。
※MYSQLの場合は、NOT NULLの列にデフォルトの値が入っていなくても、空文字が挿入されるのかなあと想像します。
※AuthパッケージはemailアドレスがかぶるとユーザーIDの登録ができないようになっています。
サービスにもよると思いますが、emailがかぶっていても登録できた方がいい場合もあるので(ErogameScapeのように気軽にユーザーIDを取得して情報を登録できるようなサイトな場合)、必要に応じてソースをいじってみてもいいかなと思います。
動くかどうかを確かめた結果が以下のような感じです。
ユーザーの作成
ログイン
login_hashの列がないので、 login_hashにDEFAULT ''を追加しないと駄目です。
※MYSQLの場合は、NOT NULLの列にデフォルトの値が入っていなくても、空文字が挿入されるのかなあと想像します。
※AuthパッケージはemailアドレスがかぶるとユーザーIDの登録ができないようになっています。
サービスにもよると思いますが、emailがかぶっていても登録できた方がいい場合もあるので(ErogameScapeのように気軽にユーザーIDを取得して情報を登録できるようなサイトな場合)、必要に応じてソースをいじってみてもいいかなと思います。
動くかどうかを確かめた結果が以下のような感じです。
ユーザーの作成
$auth = Auth::instance();
$auth->create_user("uid","passweord","mail@mail.co.jp");
すると、
ap2=# SELECT * FROM test_users ;
すると、
ap2=# SELECT * FROM test_users ;
id | username | password | group | email | last_login | login_hash | prof
ile_fields | created_at
----+----------+----------------------------------------------+-------+-----------------+------------+------------+-----
-----------+------------
1 | uid | xvBIQwcBRf0+l56uTmeAVM3MqfkI8w5jfD3VF6mJ59k= | 1 | mail@mail.co.jp | 0 | | a:0:
{} | 1348325469
(1 行)
ログイン
$auth = Auth::instance();
if( $auth->login("uid","passweord") )
{
var_dump("OK");
}
すると、
ap2=# SELECT * FROM test_users ;
ap2=# SELECT * FROM test_users ;
id | username | password | group | email | last_login | lo
gin_hash | profile_fields | created_at
----+----------+----------------------------------------------+-------+-----------------+------------+------------------
------------------------+----------------+------------
1 | uid | xvBIQwcBRf0+l56uTmeAVM3MqfkI8w5jfD3VF6mJ59k= | 1 | mail@mail.co.jp | 1348325657 | 83843e97111e17d36
62cd7148d7c9ce3f6a2b83c | a:0:{} | 1348325469
(1 行)
last_loginに時刻、login_hashにハッシュ値 が入ります。
ログイン中かを確認
if( Auth::check() )
{
var_dump(Auth::get_screen_name());
}
では、特にDBの内容はかわらなくて、
再度ログインすると
UPDATE "test_users" SET "last_login" = 1348496738, "login_hash" = 'cb94453fab5e4e05ab012457c167879e95de6e22' WHERE "username" = 'uid'
なクエリが実行されて、 last_loginの時刻、login_hashのハッシュ値 が書き換わります。
$auth = Auth::instance();
$auth->logout();
ログアウトしても、DBの内容はかわらないです。再度ログインすると
UPDATE "test_users" SET "last_login" = 1348496738, "login_hash" = 'cb94453fab5e4e05ab012457c167879e95de6e22' WHERE "username" = 'uid'
なクエリが実行されて、 last_loginの時刻、login_hashのハッシュ値 が書き換わります。