FuelPHP

FuelPHP まとめノート7(Simpleauth)

More than 3 years have passed since last update.


参照

改訂FuelPHP入門(P184)


Simpleauthを使う 設定


1.config/config.phpに一行追加する


config.php


'always_load' => array(
'packages' => array(
'orm',
'auth',
),


2./fuel/packages/auth/config/auth.phpをコピーし、/fuel/app/config/ に置いてオーバーライドする。


auth.php

<?php

return array(
'driver' => 'Simpleauth', //ここ
'verify_multiple_logins' => false,
'salt' => 'put_your_salt_here',
'iterations' => 10000,
);



DB設定

$ oil r migrate --packages=auth

Simpleauth は単一のテーブルに依存している。Auth パッケージにはこのテーブルを作成するために必要なマイグレーションファイルが含まれている。

oil refine migrate --packages=auth を実行すればあなたのために作成されたテーブルを持つことができます。


Simpleauth


  • ユーザー名、メールアドレスのいずれかをログインユーザー名として認証する仕組みになっている。

  • 最低限、ユーザー名、メールアドレス、パスワードは登録する必要がある。

create_user()メソッドを使う

Auth::instance()により、Auth_Login_Driverオブジェクトが返される

このオブジェクトからcreate_user()を実行してユーザー登録できる

ユーザー名、メールアドレス、パスワードが、POSTされる。(パスワードはハッシュ化)


ユーザー管理

Authパッケージでは、ユーザーをグループに分けて管理することができる。

create_user()の第4引数に、グループID(整数)を指定することで、登録するユーザーを該当するグループに所属させる。

デフォルトではユーザーはグループ 1 に割り当てられる。

例)100番のグループに所属

Auth::create_user($_POST['username'],$_POST['password'],$_POST['email'],100);


ログイン/ログアウト

Auth::login()

Auth::logout()


仕組み


ログイン


  • login()メソッドはユーザー名とパスワードを引数に取り、ログインに成功するとtrueを返し、失敗するとfalseを返す


  • ユーザー名として渡された文字列は、usernameカラムとemailカラムの両方から検索される



ログイン後


  • ログインすると、usersテーブルのlast_loginに最終ログイン時刻、login_hashにタイムスタンプを元にしたハッシュ値が書き込まれる。


  • ログインに成功したユーザ名とログインハッシュがセッション情報として書き込まれる



ログアウト

Auth::logout()メソッドを実行するだけで、セッションに書き込まれたログイン情報が削除される。


ログイン処理 基本型

http://fuelphp.jp/docs/1.7/packages/auth/simpleauth/intro.html


sample.php

public function action_login()

{
$data = array();
if (Input::post())
{
if (Auth::login())
{
Response::redirect('success_page');
}
else
{
$data['username'] = Input::post('username');
$data['login_error'] = 'Wrong username/password combo.';
}
}
echo View::forge('auth/login',$data);
}


ログイン状態のチェック

Auth::check()


ログイン状態でない場合はログインにリダイレクトする

if(!Auth::check())

{
Response::redirect('login');
}


check メソッド

ログインしているユーザーがいるかどうかをcheck メソッドは検査します。

// ログインしていないのであればログインを

if ( ! Auth::check())
{
Response::redirect('/login');
}


sample.php

    public function before() {

parent::before();
if (!Auth::check() and !in_array(Request::active()->action, array('login', 'index', 'view'))) {
Response::redirect('article/login');
}
}


チェック後にユーザー名やユーザーIDを取得する

Auth::get_screen_name()

Auth::get_user_id()

例)

ログイン中の場合はユーザー名とユーザーIDを渡してビューを読み込み、

ログイン中でない場合は、ログインページにリダイレクトする

if(!Auth::check()){

Response::redirect('login');
}else{
$data = array();
$data['username'] = Auth::get_screen_name();
$data['user_id'] = Arr::get(Auth::get_user_id(), 1);
Return Response::forge(View::forge('member/top'));
}


サンプル

スクリーンショット 2015-09-07 15.42.17.png


member.php

<?php

class Controller_Member extends Controller_Template
{

//テンプレートファイルを指定
public $template = 'member/template';
//管理者かどうかを示すプロパティ
public $is_admin = false;

public function before()
{
//before()をオーバーライドするので、親クラスのbefore()を呼び出す
parent::before();

//認証済みでなく、現在リクエストされているアクションが'login'でない場合は
//ログインフォームにリダイレクト
if (!Auth::check() and Request::active()->action != 'login') {
Response::redirect('member/login');
}

//ユーザが管理者(Administratorsグループ)であれば
//is_adminプロパティをtrueに設定
if (Auth::member(100)) {
$this->is_admin = true;
}
//is_adminプロパティをビューに受け渡す
View::set_global('is_admin', $this->is_admin);
}

public function action_index()
{
//会員トップページ
$this->template->title = 'ようこそ' . Auth::get_screen_name() . 'さん';
$this->template->content = View::forge('member/index');
}

public function action_login()
{
//既にログイン済みであれば会員トップページにリダイレクト
Auth::check() and Response::redirect('member');

//usernameとpasswordがPOSTされている場合は認証を試みる
if (Input::post('username') and Input::post('password')) {
$username = Input::post('username');
$password = Input::post('password');
$auth = Auth::instance();

//認証に成功したら会員トップページにリダイレクト
if ($auth->login($username, $password)) {
Response::redirect('member');
}
}

//ログインフォームの表示
$this->template->title = '会員専用ページ';
$this->template->content = View::forge('member/form');
}

public function action_logout()
{
//ログアウト
$auth = Auth::instance();
$auth->logout();

//'member'にリダイレクト
Response::redirect('member');
}

}



ビュー

views/member/template.php


template.php


<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title><?php echo $title; ?></title>
<?php echo Asset::css('bootstrap.css'); ?>
<style>
body { margin: 50px; }
</style>
</head>
<body>
<div class="topbar">
<div class="fill">
<div class="container">
<h3><a href="">FuelPHP入門ブログ</a></h3>
<ul class="nav secondary-nav">
<li class="menu">
<?php if (Auth::check()): ?>
<?php echo Html::anchor('member/logout', 'ログアウト'); ?>
<?php endif; ?>
</li>
</ul>
</div>
</div>
</div>
<div class="container">
<div class="row">
<div class="span16">
<h1><?php echo $title; ?></h1>
<?php if ($is_admin): ?>
<p><a class="btn primary" href="<?php echo Uri::create('member/admin');?>">管理者ページへ</a></p>
<?php endif; ?>
<hr>
</div>
<div class="span16">
<?php echo $content; ?>
</div>
</div>
<footer>
<p>
<a href="http://fuelphp.com">FuelPHP</a> is released under
the MIT
license.<br>
<small>Version: <?php echo e(Fuel::VERSION); ?></small>
</p>
</footer>
</div>
</body>
</html>


ビュー/フォーム

views/member/form.php


form.php


<?php echo Form::open(); ?>
<fieldset>
<div class="clearfix">
<?php echo Form::label('ユーザ名', 'username'); ?> 
<?php echo Form::input('username'); ?>
</div>
<div class="clearfix">
<?php echo Form::label('パスワード', 'password'); ?> 
<?php echo Form::password('password'); ?>
</div>
<div class="actions">
<?php echo Form::submit('submit', 'ログイン'); ?>
</div>
</fieldset>
<?php echo Form::close(); ?>





admin/管理画面

controller/member/admin.php


admin.php


<?php

class Controller_Member_Admin extends Controller_Member
{

//テンプレートファイルを指定
public $template = 'member/admin/template';

public function before()
{
//親クラスのbefore()を呼び出す
parent::before();

//is_adminプロパティがtrueでなければ、
//memberコントローラにリダイレクト
if (!$this->is_admin) {
Response::redirect('member');
}
}

public function action_index()
{
$this->template->title = 'ようこそ' . Auth::get_screen_name() . 'さん';
$this->template->content = View::forge('member/admin/index');
}

}