ラボ > FuelPHP:auth関連

FuelPHPのAUTH関連

FuelPHPでログイン周りの実装。AUTHが用意されているので使う。

作成日:2017-11-09, 更新日:2018-10-02

基本設定

必要に応じてカラムを増やしてもOK

・「テーブル名:users」の場合

名称 データ型
id int NOT NULL、AUTO_INCREMENT、PRIMARY KEY (`id`)
username varchar NOT NULL、UNIQUE KEY `username` (`username`)
password text NOT NULL
group int NOT NULL
email varchar NOT NULL、UNIQUE KEY `email` (`email`)
last_login int NOT NULL
login_hash varchar NOT NULL
profile_fields text NOT NULL
created_at int NOT NULL
updated_at int NOT NULL

クエリ

CREATE TABLE IF NOT EXISTS `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(255) NOT NULL,
  `password` text NOT NULL,
  `group` int(11) NOT NULL,
  `email` varchar(255) NOT NULL,
  `last_login` int(11) NOT NULL,
  `login_hash` varchar(255) NOT NULL,
  `profile_fields` text NOT NULL,
  `created_at` int(11) NOT NULL,
  `updated_at` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `username` (`username`),
  UNIQUE KEY `email` (`email`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

※日付関連はint型にしておくとFuelPHP側で都度、書換え等してくれる。

他の設定

「fuel\packages\auth\config」の中にいる下記ファイルを「fuel\app\config」の中に複製してから修正。

「auth.php」で色々設定 ・Saltの設定(salt)
・使うAuthのドライバの設定(driver)
「simpleauth.php」で色々設定 ・groups、rolesの設定
・Saltの設定(login_hash_salt)
・テーブルで使うログインID、パスワードのキーネーム(username_post_key、password_post_key)
・テーブル名(table_name)

よく使う関数

各変数($id, $username, $password, $email)は上記の各カラム名の値

ユーザー作成

作成されたユーザレコードの 「id」 が返ってくる。失敗は「false」

ユーザー作成
\Auth::create_user($username, $password, $email);
ユーザー作成(グループ付き)
\Auth::create_user($username, $password, $email, $group);

ログイン周り

ログイン中か確認
if(!\Auth::check()) {
   // 未ログイン
}
else {
   // ログイン中
}
emailでログイン
if ( \Auth::login($email, $password) ) {
  // ログイン成功
}
usernameでログイン
if ( \Auth::login($username, $password) ) {
  // ログイン成功
}
強制ログイン
\Auth::force_login($id)
ログアウト
\Auth::logout();

ユーザー情報の取得

ログインしている人の指定したカラムの値(※「カラム:username」の値が欲しいとき)
$value = \Auth::get('username');

※カラム名を引数にする。usernameなどカラムによっては専用の関数が用意されているけど、覚えるのが面倒ならget()だけ覚えておけばいい。

ログインしている人の指定したカラムの値(※「カラム:profile_fields」の「〇〇〇」が欲しいとき)
$value = \Auth::get_profile_fields('〇〇〇', '');

※第2引数:見つからなかったときの初期値

ユーザー情報の編集

ログインしている人の情報書き換え
\Auth::update_user( array("email"=>〇〇〇) );

※戻り値は成功したらtrue。失敗はfalse。

ログインしている人の情報書き換え(profile_fields)
\Auth::update_user( array("〇〇〇"=>〇〇〇) );

※存在しないカラム名は「profile_fields」の中にシリアライズされて格納される

ユーザー指定で情報書き換え
\Auth::update_user( array("email"=>〇〇〇), 対象のusername );

パスワードの変更

パスワード書換え
\Auth::change_password($old_password, $new_password, $username);

※戻り値は成功したらtrue。失敗はfalse(旧パスワードが間違っているとき)

強制パスワード書換え:一発では出来ない。一度、リセットしてから書き換える
$old_password = \Auth::reset_password($username);
\Auth::change_password($old_password, $new_password, $username);

※「reset_password()」で新しいパスワードが返ってくるので、コレを古いパスワードとする。

「カラム:profile_fields」の更新・削除について

追加・更新

例)「email」と「profile_fields」の「zebra」を書き換えたい

$ary = array(
   'email' => 〇〇〇, // 「カラム:email」に格納
   'zebra' => 〇〇〇, // 「カラム:profile_fields」にシリアライズされた値が格納される
);
if ( \Auth::update_user($ary) ) {
   echo '更新成功';
}
else {
   echo '更新失敗';
}

※「zebra」が無ければ追加、あれば更新。

削除

「カラム:profile_fields」に追加した値のクリアはできない。

どうしてもクリアしたいなら「カラム:profile_fields」を手動で書き換える(serialize()する)

$newProfileFields = array(
   〇〇〇 => 〇〇〇,
);
// 「\auth::update_user()」を使わずに「カラム:profile_fields」に「serialize($newProfileFields)」を書き込む

まとめ

ログインする

$name = 〇〇〇;  // username or email
$pswd = 〇〇〇;  // パスワード
if ( !\Auth::login($name, $pswd) ) {
  echo 'username or email or パスワードが間違っている';
}
else {
  echo 'ログイン成功';
}

ログイン可能かチェック(ログインはしない)

$name = 〇〇〇;  // username or email
$pswd = 〇〇〇;  // パスワード
if ( !$user = \Auth::validate_user($name, $pswd) ) {
  echo 'username or email or パスワードが間違っている';
}
else {
  var_dump($user);
}

自分自身がログインしているかチェック

if ( !\Auth::check() ) {
  echo 'ログインしていない';
}
else {
  echo 'ログイン中';
}

新規

$name = 〇〇〇;  // username: ユーザー名
$pswd = 〇〇〇;  // password: パスワード
$mail = 〇〇〇;  // email   : メールアドレス
$grop = 〇〇〇;  // group   : ユーザーグループ
$pFid = array(   // profile_fields
   〇〇〇 => 〇〇〇,
   〇〇〇 => 〇〇〇,
);

if ( !$id = \Auth::create_user($username, $password, $email, $group, $pFid) ) {
  echo '作成失敗';
}
else {
  echo '作成成功 id=' . $id;
}

※第5引数の$pFid(profile_fields)は無くてもOK

更新

$username = 〇〇〇; // 更新対象
$update = array(
  'group' => 〇〇〇,
  'email' => 〇〇〇,
  
  // ▼「username」は仕様上、NG(セキュリティ対策)
  // 'username' => ×××,
  
  // ▼パスワードも更新するときは「old_password」も必要
  'password'     => 〇〇〇,
  'old_password' => 〇〇〇,
  
  // ▼profile_fieldsの値
  〇〇〇 => 〇〇〇,
);

if ( !\Auth::update_user( $update, $username ) ) {
  echo '更新失敗';
}

※第2引数の$usernameを省略すると自分自身を対象にする
※更新しないカラムはセットしなくてOK

profile_fieldsをクリアしたい

シリアライズしたデータをprofile_fieldsにセットして直接updateを実行。

username・その他のカラムを変更したい

直接updateを実行。

パスワードだけ書換え

$username = 〇〇〇; // 更新対象
$oldPsd = 〇〇〇;   // 今までのパスワード
$newPsd = 〇〇〇;   // 新しいパスワード

if ( !Auth::change_password($oldPsd, $newPsd, $username) ) {
  echo '更新失敗';
}

※第2引数の$usernameを省略すると自分自身を対象にする

パスワード強制書換え(パスワードリセットしてから書き換える)

$username = 〇〇〇; // 更新対象
$newPsd = 〇〇〇;   // 新しいパスワード

$oldPsd = \Auth::reset_password($username);
if ( !Auth::change_password($oldPsd, $newPsd, $username) ) {
  echo '更新失敗';
}

関連項目

FuelPHPで複数の端末で同時ログインOKにする