FuelPHPでログイン機能をサクっと実装
SimpleAuthを使えば、簡単にログイン処理が実装出来てしまいます。
今回は手っ取り早く、Fieldsetを使用し、実装してみます。
オートロード設定
まずはauthパッケージを自動的に読み込むよう設定を行います。
fuel/app/config/config.php
'always_load' => array( 'packages' => array( 'auth', ... ), ... ),
設定ファイルのコピー
次にSimpleAuthに必要な設定ファイルをコピー後、saltの値を編集します。
$ cp fuel/packages/auth/config/auth.php fuel/app/config/ $ cp fuel/packages/auth/config/simpleauth.php fuel/app/config/
fuel/app/config/auth.php
<?php return array( 'driver' => 'SimpleAuth', 'verify_multiple_logins' => false, 'salt' => '任意の文字列' );
fuel/app/config/simpleauth.php
<?php return array( ... 'login_hash_salt' => '任意の文字列', ... );
認証用テーブルの作成
Database tableに従い、認証用のテーブルを作成します。
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 , `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` ) )
ログインユーザーの作成
初期状態ではログインユーザーがいない為、コマンドラインにて、ユーザー作成を行います。
$ oil console >>> Auth::create_user('ユーザー名', 'パスワード', 'メールアドレス'); 例) >>> Auth::create_user('admin', 'password', 'hoge@hoge.com');
Controller
Controllerでは単純に、『$auth->login』を実行し、ログイン成功/失敗の判断を行っています。
今回は簡易的なログイン機能の為、ログイン用のControllerの中でログアウト処理(『Auth::logout()』)を行っており、ログアウトさせる際には、ログインページにリダイレクトする事になります。
<?php class Controller_Login extends Controller { public function action_index() { $error = null; $view = View::forge('login/index'); $form = Fieldset::forge(); $form->add('username', 'アカウント', array('maxlength' => 8)) ->add_rule('required') ->add_rule('max_length', 8); $form->add('password', 'パスワード', array('type' => 'password')) ->add_rule('required') ->add_rule('max_length', 8); $form->add('submit', '', array('type' => 'submit', 'value' => 'ログイン')); $form->repopulate(); $auth = Auth::instance(); Auth::logout(); if (Input::post()) { if ($form->validation()->run()) { if ($auth->login(Input::post('username'), Input::post('password'))) { // ログイン成功時 Response::redirect('welcome/index'); } $error = 'ログイン失敗に失敗しました'; } else { $error = 'ログイン失敗に失敗しました'; } } $view->set_safe('form', $form->build(Uri::create('login/index'))); $view->set('error', $error); return $view; } }
View
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> </head> <body> <?php if (isset($error)): ?> <?php echo $error ?> <?php endif ?> <?php echo $form ?> </body> </html>
ログインチェック
ログイン済みユーザーだけに表示させるページの場合、Controller側で以下の処理を追加します。
<?php public function before() { parent::before(); if (Auth::check()) { } else { // 未ログイン時はログインページへリダイレクト Response::redirect('login/index'); } }
これで完了です。