CakePHP2.2のAuthコンポーネントで簡単認証

今日は、CakePHPのAuthコンポーネントを利用してサイトの個別ページに認証機能を追加する方法を調べてみたいと思います。尚、CakePHPには、Atuhコンポーネント以外にAcl(アクセスコントロールリスト)コンポーネントもありますが、Aclコンポーネントも調べるとなると長くなりそうなので、Aclコンポーネントに関しては後日改めて調べてみます。

1. 認証用のデータベーステーブルですが、以前『FuelPHPで簡単認証システム』で使用したUsersテーブルをそのまま利用したいと思います。CakePHPのAuthコンポーネントで最低限必要なフィールド名は、『id』『username』『password』ですので、そのまま流用が出来そうです。

セッションの設定

2. ログイン関連には、セッションを使用しますので、セッション関係の設定をまず行います。core.phpの175行目以下を下記のように変更します。

app/Config/core.php

Configure::write('Session', array(
 'defaults' => 'database',
 'cookie' => 'SID',
 //セッションの保持時間(秒数)
 'timeout' => 86400,
 ));

3. セッションの保残先をデータベースにしましたので、データベーステーブルを作成します。

CREATE TABLE IF NOT EXISTS `cake_sessions` (
  `id` varchar(255) NOT NULL DEFAULT '',
  `data` text NOT NULL,
  `expires` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

コントローラの作成

4. それでは、UsersControllerを作成します。

app/Controller/UsersController.php

<?php
class UsersController extends AppController{
 //使用モデルの指定(省略可)
 public $uses = array('User');
 //使用コンポーネントの登録
 public $components = array(
 'Session',
 'Auth' => array(
 //ログイン後の移動先
 'loginRedirect' => array('controller' => 'users', 'action' => 'index'),
 //ログアウ後の移動先
 'logoutRedirect' => array('controller' => 'users', 'action' => 'login'),
 //ログインページのパス
 'loginAction' => array('controller' => 'users', 'action' => 'login'),
 //未ログイン時のメッセージ
 'authError' => 'あなたのお名前とパスワードを入力して下さい。',
 )
 );
 function beforeFilter(){
 //親クラスのbeforeFilterの読み込み
 parent::beforeFilter();
 //認証不要のページの指定
 $this->Auth->allow('login', 'logout','add'); }
 //indexアクション(認証が必要なページ)
 function index(){
 //アクセス情報をビューに渡す
 $this->set('userinfo',$this->Auth->user());
 }
 //ログインアクション(認証が不要なページ)
 function login(){
 //POST送信なら
 if($this->request->is('post')) {
 //ログインOKなら
 if($this->Auth->login()) {
 //Auth指定のログインページへ移動
 return $this->redirect($this->Auth->redirect());
 } else { //ログインNGなら
 $this->Session->setFlash(__('ユーザ名かパスワードが違います'), 'default', array(), 'auth');
 }
 } 
 }
 //ログアウトアクション(認証が不要なページ)
 function logout(){
 $this->Auth->logout();
 }
 //ユーザー追加(認証が不要なページ)
 function add(){
 //POST送信なら
 if($this->request->is('post')) {
 //パスワードのハッシュ値変換
 $this->request->data['User']['password'] = AuthComponent::password($this->request->data['User']['password']);
 //ユーザーの作成
 $this->User->create();
 //リクエストデータを保存できたら
 if ($this->User->save($this->request->data)) {
 $this->Session->setFlash(__('新規ユーザーを追加しました'));
 $this->redirect(array('action' => 'index'));
 } else { //保存できなかったら
 $this->Session->setFlash(__('登録できませんでした。やり直して下さい'));
 }
 }
 }
}

ビューファイルの作成

5. 次にViewフォルダにUsersフォルダを作成し、各ビューページを作成します。新規ユーザー作成のためのadd.ctpを作成します。

app/View/Users/add.ctp

<?php
 echo $this->Form->create('User', array('url' => 'add'));
 echo $this->Form->input('username',array('label'=>'ユーザ名'));
 echo $this->Form->input('password',array('label'=>'パスワード'));
 echo $this->Form->input('email',array('label'=>'メールアドレス'));
 echo $this->Form->end('新規ユーザを作成する');
?>

6.  ログインフォームとログアウトページを作成します。

app/View/Users/login.ctp

<?php echo $this->Session->flash('auth'); ?>
<?php echo $this->Form->create('User', array('url' => 'login')); ?>
<?php echo $this->Form->input('username', array('label' => 'ユーザ名')); ?>
<?php echo $this->Form->input('password', array('label' => 'パスワード')); ?>
<?php echo $this->Form->end('ログイン'); ?>

app/View/Users/logout.ctp

<h2>ログアウトしました</h2>
<ul>
<li><?php echo $this->Html->link('ログインページへ','index');?></li>
<li><?php echo $this->Html->link('新規作成','add');?></li>
</ul>

7. そして、indexページを作成します。indexページには、ログインしている人の情報が分かるようにします。

app/View/Users/index.ctp

<p>ようこそ!<?php echo h($userinfo['username']);?>さん</p>
<p>あなたの登録メールアドレスは<?php echo h($userinfo['email']);?>です。</p>
<h2>ここはIndexページです</h2>
<ul>
<li><?php echo $this->Html->link('ログアウト','logout',array(),'ログアウトしてもいいですか?');?></li>
<li><?php echo $this->Html->link('新規ユーザ作成','add',array());?></li>
</ul>

8. それでは、実際にブラウザで確認してみます。右側にはテーマで作成したスマートフォン用のレイアウト及びビューで表示しています。CakePHPの『テーマ』機能は、簡単な手続きで、PC用のサイトとスマートフォン用のサイトを同じコントローラで表示することが出来ます。FuelPHPのテーマクラスも同じような事が出来るのだと思いますが、ドキュメントが解読できずに今一使い方が分かりません。その点、CakePHPの『テーマ』機能は簡単に使用することが出来ます。CakePHPの『テーマ』機能については、『CakePHP2.1でjQueryMobileを使う(実践編その8)』の中頃に記述していますので、参考にして下さい。

9. 登録が成功すると、『新規ユーザを追加しました。』のメッセージと共に、ログインを促すページが表示されます。

10. 先程登録したユーザ名とパスワードを入力すると、indexページが表示されます。indexページにはユーザー情報が表示されるように作成しました。

 バリデーション処理

11. さて、今作成したプログラムは、バリデーション処理を行っておりません。バリデーション処理を行うためにモデルを作成したいと思います。

app/Model/User.php 

<?php
class User extends AppModel{
 //モデル名の指定(省略可)
 public $name = 'User';
 //バリデーションの設定
 public $validate = array(
 'username' => array(
 'required' => array(
 'rule' => array('notEmpty'),
 'message' => 'ユーザー名を入力して下さい。'
 )
 ),
 'email' => array(
 'required' => array(
 'rule' => array('email'),
 'message' => 'メールアドレスを入力してください。'
 )
 ),
 'password' => array(
 'required' => array(
 'rule' => array('minLength',8),
 'message' => 'パスワードは8文字以上にして下さい。'
 )
 ),
 );
//保存前にハッシュ値変換を行います
 public function beforeSave($options=array()) {
 if (isset($this->data[$this->alias]['password'])) {
 $this->data[$this->alias]['password'] = AuthComponent::password($this->data[$this->alias]['password']);
 }
 return true;
 }
}

12. コントローラ内で行っていたパスワードのハッシュ値変換をモデル内で、データをセーブする直前に行いますので、コントローラ内の50~51行目は削除して下さい。

13. それでは、バリデーションチェックをしてみましょう。間違ったデータを入力してみます。バリデーションの条件に合わないときは弾かれるようになりました。

14. これで、ページに認証をかけるための簡単なプログラムは完成しました。後は、これにアクセスしてきたユーザによって挙動を振り分けるためにAclコンポーネントが必要になってきます。Aclコンポーネントについては、後日調べてみたいと思います。

本日は以上です。

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

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

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

コメントをどうぞ

このページの先頭へ