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

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

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

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

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

	'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
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のドキュメントの はじめに 例 とほぼ同じです。

	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 メソッドを利用してログインを実行します。

<?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引数の追加情報はここでは使わないので省略しています。

	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);
	}
<?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(); ?>

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

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

ログアウト処理

	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 だけをチェック対象としています。

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