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');
    }
}

これで完了です。