FuelPHPで簡単認証システム

会員専用サイトや社内専用サイトを作成するには欠かせない認証システムですが、FuelPHPには、『SimpleAuth』という認証システムがパッケージとして同梱されています。今日はその『SimpleAuth』の使い方を見てみたいと思います。

1) まず、Auth(認証システム)を使うには、パッケージでAuthを有効にする必要があります。configファイルの187行目あたりの’packages’に’auth’を追加します。

fulel/app/config/config.php

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

2) パッケージ内のauth.phpとsimpleauth.phpをアプリケーション内のconfigフォルダにコピーします。

fuel/packages/config/auth.php→fuel/app/config/auth.php

fuel/packages/config/simpleauth.php→fuel/app/config/simpleauth.php

3) コピーしたauth.phpの25行目を修正します。認証セキュリティのための文字列ですので、意味不明の文字列で構わないと思います。

salt’=>’vijtk98tig4iutitgo’,

4) 同じくコピーしたsimpleauth.phpの88行目も同様に修正しておきます。

‘login_hash_salt’=>’itu6togomcitvciy’,

5) phpMyadminを起動して、SQLタブをクリックし、FulePHPのマニュアルのコード(下記)をコピー&ペーストして、実行ボタンをクリックします。

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`
)
)

6) usersという名前のテーブルが作成されました。

7) Sample1コントローラにloginメソッドを作成します。これもマニュアルのほぼ丸写しです。

fuel/app/classes/controller/sample1.php

public function action_login()
 {
 $data = array();
 if ($_POST)
 {
 // Authのインスタンス化
 $auth = Auth::instance();
 // 資格情報の確認
 if ($auth->login($_POST['username'],$_POST['password']))
 {
 // 認証OKならトップページへ
 Response::redirect('index');
 }
 else
 {
 //認証が失敗したときの処理
 $data['username'] = $_POST['username'];
 $data['login_error'] = 'ユーザー名かパスワードが違います。再入力して下さい。';
 }
 }
// ログインフォームの表示
 echo View::forge('sample1/login',$data);
 }
}

8) 次に、ビューファイルlogin.phpを作成します。

fuel/app/views/sample1/login.php

<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>ログイン</title>
</head>
<body>
<form name="form1" method="post" action="">
<?php echo $login_error?>
 <table width="100%" border="1">
 <tr>
 <th scope="row">ユーザー名</th>
 <td><label for="username"></label>
 <input name="username" type="text" id="username" value="<?=$username?>"></td>
 </tr>
 <tr>
 <th scope="row">パスワード</th>
 <td><label for="password"></label>
 <input type="password" name="password" id="password"></td>
 </tr>
 <tr>
 <th colspan="2" scope="row"><input type="submit" name="button" id="button" value="送信"></th>
 </tr>
 </table>
</form>
</body>
</html>

9) さて、ログインページを作成しても、データベースにデータが登録されていなければ、ログインできませんので、データ登録画面も作成します。先に登録用のビューファイルadd_user.phpを作成します。

fuel/app/views/sample1/add_user.php

<!DOCTYPE HTML>
 <html>
 <head>
 <meta charset="utf-8">
 <title>ユーザー登録</title>
 </head>
 <body>
 <form name="form1" method="post" action="">
 <table width="100%" border="1">
 <tr>
 <th colspan="2" scope="row">ユーザー登録</th>
 </tr>
 <tr>
 <th scope="row">ユーザー名</th>
 <td><label for="username"></label>
 <input name="username" type="text" id="username"></td>
 </tr>
 <tr>
 <th scope="row">Eメール</th>
 <td><label for="email"></label>
 <input type="text" name="email" id="email"></td>
 </tr>
 <tr>
 <th scope="row">パスワード</th>
 <td><label for="password"></label>
 <input type="password" name="password" id="password"></td>
 </tr>
 <tr>
 <th colspan="2" scope="row"><input type="submit" name="button" id="button" value="登録"></th>
 </tr>
 </table>
 </form>
 </body>
 </html>

10) add_userメソッドも作成します。

fuel/app/classes/controller/sample1.php

public function action_add_user()
 {
 if ($_POST)
 {
 //POSTデータを受け取る
 $username=Input::post('username');
 $password=Input::post('password');
 $email=Input::post('email');
 // Authのインスタンス化
 $auth = Auth::instance();
 //ユーザー登録
 $auth->create_user($username,$password,$email);
 }
 // 登録フォームの表示
 echo View::forge('sample1/add_user');
 }

11) それでは、ユーザー登録してみましょう。

12) phpMyadminで確認してみます。きちんと登録できました。

13) それでは、いよいよユーザー認証してみましょう。まず、最初に間違ったパスワードで入力してみます。エラーメッセージが表示されて、再度パスワード入力画面に戻りました。

14) 次に正しい、ユーザー名とパスワードを入力してみます。きちんとトップページへ移動しました。只、アドレスに『publci/index.php/』が付与されています。ちょっとみっともないので、後日修正方法があったら、調べてみたいと思います。今日は、特に支障がないので、このまま進めます。

15) ログインフォームからトップページへのユーザー認証は出来たのですが、このままでは、URLから直接アクセスすることが出来ます。認証していない人がアクセスしてきたときに、強制的にログインページへ移動させるようにしましょう。

16) indexメソッドを修正します。

fuel/app/classes/controller/sample1.php

public function action_index()
 {
 //認証していなかったら
 if(!Auth::check())
 {
 //ログインページへ移動
 Response::redirect('sample1/login');
 }else{
 //データベース接続
 $query = DB::select()->from('dvd')->execute();
 //ビュークラスのforgeメソッドの呼び出し
 $view=View::forge('sample1/index');
 //データベース情報の引き渡し
 $view->set_global('query',$query->as_array());
 //基本データのセット
 $view->set_global('title','WinRoad徒然草');
 $view->set_global('description','FuelPHPのテストサイトです');
 //ビューファイルのネスト
 $view->header=View::forge('sample1/header');
 $view->content=View::forge('sample1/content');
 $view->footer=View::forge('sample1/footer');
 return $view;
 }
 }

17) 只、現状だとログイン中なのかどうかブラウザだけでは不明なので、トップページ(正確には、Content)にユーザー名を表示して、下の方にログアウト用のリンクを作成します。ログアウトの為のメソッドaction_logoutも作成したいと思います。

18) まず、トップページユーザー名の表示とログアウト用のリンクを作成するために、content.phpを修正します。

fuel/app/views/sample1/content.php

<div class="content">
<h2>ようこそ<?=Auth::get_screen_name()?>さん</h2>
<p><?=$description?></p>
<table width="100%" border="1">
 <tr>
 <th scope="col">タイトル</th>
 <th scope="col">内容</th>
 </tr>
<?php foreach ($query as $row): ?>
 <tr>
 <td><?=$row['title']?></td>
 <td><?=$row['content']?></td>
 </tr>
<?php endforeach;?>
</table>
<p><a href="logout">ログアウト</a></p>
</div>

19) 次に、logoutメソッドを作成します。

fuel/app/classes/controller/sample1.php

public function action_logout()
 {
 //ログアウト
 Auth::logout();
 //ログアウト画面の表示
 echo View::forge('sample1/logout');
 }

20) 一応ログアウト用のビューも作成しておきます。

<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>ログアウト</title>
</head>
<body>
<p>ログアウトしました。 </p>
<p><a href="index">TOPページへ</a></p>
</body>
</html>

21) それでは、一端ログアウトして、トップページへのリンクをクリックしてみます。

22) きちんとログインページへ移動しました。ちなみに、URLを直接打ち込んでも、ログインページへ移動します。

23) それでは再度ログインしてみます。トップページに移動して、ユーザー名が表示されました。

24) 今回、get_screen_name()メソッドでビューに直接ログインユーザー名を表示しましたが、セキュリティ的には、コントローラでget_screen_nameメソッドを呼び出して、コントローラからビューにログインユーザー名をデータとして渡しが方がいいのかなとは思います。

本日は、SimpleAuthの使い方の基礎的なことを調べてみました。尚、本格的に認証システムを作成するには、バリデーション処理やCSRF対策が必要ですので、『9ensanのLifeHack』様のサイトはとても勉強になると思います。

只、残念なのは、公式サイトのマニュアルが完成していない点です。AuthパッケージのGropusやACLの使い方のマニュアルがないので、社内専用サイトを作成したい私にとっては若干の不満です。

このエントリーを含むはてなブックマーク Buzzurlにブックマーク livedoorクリップ Yahoo!ブックマークに登録

トラックバック&コメント

この投稿のトラックバックURL:

トラックバック

  1. […]   FuelPHPで簡単認証システム | WinRoad徒然草 FuelPHPでログイン機能をサクっと実装 – BTT’s blog [FuelPHP] […]

コメント

  1. 坂本貴洋 より:

    FuelPHPで会員管理(アプリ編その1)
    にて
    1. Authパッケージを有効にする方法や、usersテーブルの作成方法は…
    とありますが、FulePHPのコードではcreatedまで(このページではcreated_at)ですが
    いきなりupdated_atがモデルに含まれているため、エラーが出て混乱する人もいるのでは

    • nakada より:

      坂本 様
      コメントありがとうございます。
      確かに同じデータベーステーブルを使い回していると途中で追加したり、修正したフィールドとかを忘れたりしていますね。
      今後気をつけたいと思います。
      早急にブログは修正しておきます。

      • 坂本貴洋 より:

        もうひとつ気になったのがユーザー一覧にadimin/edit/のancorがある。自分で実装してねということだと思うけど、まったくその後それについてふれずおわっているというところでしょうか

        • nakada より:

          坂本様
          コメントありがとうございます。
          すみません、私の癖で、後で作成しようと思ったリンク先などを先に記述することがままあります。
          きちんとその日のブログにリンク先のページまで作成するか、読者に委ねるのかを告げればいいのですが、
          後日ブログ記事にしようと思って忘れてしまったのか、記事にするほどでも無いと思ったのかも定かではありません。
          今後気をつけたいと思います。


コメントをどうぞ

このページの先頭へ