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