FuelPHP Authパッケージ – Simpleauthの使い方


FuelPHPは認証機能を標準で含まれるパッケージAuthで提供しています。
Authには3つのドライバーの実装が含まれています。

  • Simpleauth: 基本パッケージ
  • Ormauth: 基本パッケージのORM対応版
  • Opauth: Facebook、Twitter連携などログイン連携機能を提供

Authパッケージは、機能をAPI形式で利用します。
(Railsでいうところのdeviseではなくsorceryに近い)
そのため、決まりきった定型フォームを用意する必要があり面倒ですが、柔軟にサインアップフローが設計できるという面もあります。

以下、Simpleauthの使い方を確認した際のメモです。

auth パッケージを always_load に設定
注意: configも追加する必要あり

// app/config/config.php
    'always_load'  => array(
        // ...
        'packages'  => array('auth'),
        // ...
        'config'  => array('auth'),
        // ...
    ),

simpleauth用のテーブルを定義

$ oil refine migrate --packages=auth
Performed migrations for package:auth:
001_auth_create_usertables
002_auth_create_grouptables
003_auth_create_roletables
004_auth_create_permissiontables
005_auth_create_authdefaults
006_auth_add_authactions
007_auth_add_permissionsfilter
008_auth_create_providers
009_auth_create_oauth2tables
010_auth_fix_jointables

テスト用コントローラを作成

$ oil generate controller auth login register success_page
    Creating view: /Applications/MAMP/htdocs/fuelphp-simpleauth/fuel/app/views/template.php
    Creating view: /Applications/MAMP/htdocs/fuelphp-simpleauth/fuel/app/views/auth/login.php
    Creating view: /Applications/MAMP/htdocs/fuelphp-simpleauth/fuel/app/views/auth/register.php
    Creating view: /Applications/MAMP/htdocs/fuelphp-simpleauth/fuel/app/views/auth/success_page.php
    Creating controller: /Applications/MAMP/htdocs/fuelphp-simpleauth/fuel/app/classes/controller/auth.php
// fuel/app/classes/controller/auth.php
class Controller_Auth extends Controller_Template
{
    public function before()
    {
        ...
    }

    public function action_login()
    {
        ...
    }

    public function action_success_page()
    {
        ...
    }

    public function action_register()
    {
        ...
    }

    public function action_logout()
    {
        ...
    }
}

ログイン処理は、Simpleauthのドキュメントの はじめに 例 とほぼ同じです。

// fuel/app/classes/controller/auth.php#action_login
    public function action_login()
    {
        $data = array();

        if (Input::post())
        {
            if (Auth::login(Input::post('email'), Input::post('password')))
            {
                Response::redirect('auth/success_page');
            }
            else
            {
                $data['username']    = Input::post('username');
                Session::set_flash('error', 'Wrong username/password combo. Try again');
            }
        }

        $this->template->title = 'Auth » Login';
        $this->template->content = View::forge('auth/login', $data);
    }

Auth::login メソッドを利用してログインを実行します。

// fuel/app/views/auth/login.php
<?php echo Form::open(); ?>
    <div class="control-group">
        <label class="control-label" for="email">Email</label>
        <?php echo Form::input('email', '', array('id'=>'email', 'class'=>'form-control', 'placeholder'=>'Email')); ?>
    </div>
    <div class="control-group">
        <label class="control-label" for="password">Password</label>
        <?php echo Form::password('password', '', array('id'=>'password', 'class'=>'form-control', 'placeholder'=>'Password')); ?>
    </div>
    <div class="control-group">
        <?php echo Form::submit('submit', 'Login', array('class'=>'btn btn-primary')); ?> |
        <?php echo Html::anchor('auth/register', 'Sign up'); ?>
    </div>
<?php echo Form::close(); ?>

Controller_Templateを利用しているので、メッセージはset_flashしています。

ユーザの登録処理は、Auth::create_userを使用します。
第4引数のグループと第5引数の追加情報はここでは使わないので省略しています。

// fuel/app/classes/controller/auth.php#action_register
    public function action_register()
    {
        $data = array();

        if (Input::post())
        {
            Auth::create_user(
                Input::post('username'),
                Input::post('password'),
                Input::post('email')
            );
            Session::set_flash('success', 'You have been successfully registered.');
            Response::redirect('auth/login');
        }
        $this->template->title = 'Auth &raquo; Register';
        $this->template->content = View::forge('auth/register', $data);
    }
// fuel/app/views/auth/register.php"]
<?php echo Form::open(); ?>
    <div class="control-group">
        <label class="control-label" for="email">Email</label>
        <?php echo Form::input('email', '', array('id'=>'email', 'class'=>'form-control', 'placeholder'=>'Email')); ?>
    </div>
    <div class="control-group">
        <label class="control-label" for="username">Username</label>
        <?php echo Form::input('username', '', array('id'=>'username', 'class'=>'form-control', 'placeholder'=>'Username')); ?>
    </div>
    <div class="control-group">
        <label class="control-label" for="password">Password</label>
        <?php echo Form::password('password', '', array('id'=>'password', 'class'=>'form-control', 'placeholder'=>'Password')); ?>
    </div>
    <div class="control-group">
        <?php echo Form::submit('submit', 'Register', array('class'=>'btn btn-primary')); ?> |
        <?php echo Html::anchor('auth/login', 'Login'); ?>
    </div>
<?php echo Form::close(); ?>

ログイン成功後のテストページ

// fuel/app/classes/controller/auth.php#action_success_page"]]
    public function action_success_page()
    {
        $this->template->title = 'Auth &raquo; Success page';
        $this->template->content = View::forge('auth/success_page');
    }
// fuel/app/views/auth/success.php"]
<p>Success page</p>
<p><?php echo Html::anchor('auth/logout', 'Logout'); ?></p>

ログアウト処理

// fuel/app/classes/controller/auth.php#action_logout
    public function action_logout()
    {
        if ( Auth::logout() )
        {
            Response::redirect('auth/login');
        }
        else
        {
            Session::set_flash('error', 'Logout failed.');
            Response::redirect_back('auth/success_page', 'refresh');
        }
    }

認証チェック
ログイン済みかどうかは、Auth::check メソッドを使ってbeforeメソッドでチェックしています。

ここでは、success_page だけをチェック対象としています。

// fuel/app/classes/controller/auth.php#before
    public function before()
    {
        parent::before();

        if ( Request::active()->action === 'success_page' && ! Auth::check())
        {
            Session::set_flash('error', 'You must be logged in.');
            Response::redirect('auth/login');
        }
    }
,