[CakePHP] ログイン認証

タグ :

Webサイト上ではログイン認証機能は基本機能の一つですが、その作成には大変な手間が必要となります。
CakePHPにおいて、ログイン認証機能はコンポーネントを使用すれば簡単にできます。

今回は「メールアドレス」と「パスワード」を入力することでログインが可能とする認証ページを作成したいと思います。

Authコンポーネント

このコンポーネントは主に以下の機能をサポートしています。

  • ログイン/ログアウト
  • アクセス制御(ログアウト状態でページにアクセス時にログイン認証を求める)
  • ログイン後にユーザー情報をセッションとして格納
  • パスワードのハッシュ化

これらの機能を使うには、以下の設定が必要となります。

[セッションの設定]

「app/config/core.php」にてセッションの設定を行います。

Configure::write('Session', array(
	'defaults' => 'database',
	'cookie' => 'SID',
	'timeout' => 86400,
));

セッションには「データベース」か「Cookie」を使用するように設定できますが、自分はデータベースを使用することにしました。。

[テーブル作成]

テーブルの作成は、phpMyAdminのSQL入力画面にて以下のコードを記述してテーブルを生成します。

cake_auth_1

まずはデータベースにセッション用のテーブルを作成します。

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;

次にUsersテーブルを作成します。

CREATE TABLE users (
   id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
   username VARCHAR(255),
   password VARCHAR(50),
   created DATETIME DEFAULT NULL,
   modified DATETIME DEFAULT NULL
);

上記のフィールド名はCakePHPの命名規則で決まっているものですので、そのままの名前で使用します。
今回は、「username」にメールアドレスを入れることにします。
「username」の名前以外に設定するときは、別途Authの設定が必要となります。

[Bake]

作成したUsersテーブルでBakeします。
Bakeについては前述した記事を参照してください。

以下のファイルが作成されます。

[Model]
 - User.php
[View]
 - [Users]
   - index.ctp
   - add.ctp
   - edit.ctp
   - view.ctp
[Controller]
 - UsersController.php

コントローラの変更

まずは、コンポーネント変数の設定を行います。

public $components = array(
   'Session',
   'Auth' => array(
      'loginRedirect' => 「〜(ログイン後の移動先)」,
      'logoutRedirect' => 「〜(ログアウト後の移動先)」,
      'loginAction' => 「〜(ログインページのパス)」,
      'authError' => 「〜(Authエラー時に表示する文字)」,
   )
);

「〜」内に任意の移動先または文字列を入力します。

次に各関数を追記します。

public function beforeFilter() {
   parent::beforeFilter();	// 親クラスのbeforeFilterの読み込み
   $this->Auth->allow('login', 'add');	// 認証不要のページの指定
}

function index() {
   // 認証後に遷移するページの処理
}

function login() {
   if($this->request->is('post')) {
      if($this->Auth->login()) {
         $this->redirect($this->Auth->redirect());
      } else {
         $this->Session->setFlash(__('error'), 'default', array(), 'auth');
      }
   } 
}

function logout() {
   $this->Auth->logout();
   $this->redirect($this->Auth->redirect());
}

function add() {
   // POST送信なら
   if($this->request->is('post')) {
      $this->request->data['User']['password'] = AuthComponent::password($this->request->data['User']['password']);
      $this->request->data['User']['role'] = "author";
      $this->User->create();
      if ($this->User->save($this->request->data)) {
         $this->Session->setFlash(__('新規ユーザーを追加しました'));
         $this->redirect(array('action' => 'index'));
      } else {
         $this->Session->setFlash(__('登録できませんでした。やり直して下さい'));
      }
   }
}

add()ではパスワードの登録時にハッシュ化してから登録することでセキュリティを高めます。

ビューの変更

追加で「login.ctp」を作成します。
ビュー表示は任意の構成で作成すればよいですが、ログインに必要な情報(メールアドレス、パスワード)は入力できるようにしておきます。

<?php
   echo $this->Form->create('User', array('url'=>'login'));
   echo $this->Form->input('username',array('label'=>'メール'));
   echo $this->Form->input('password',array('label'=>'パス'));
   echo $this->Form->end('ログイン');
?>

Share

  • このエントリーをはてなブックマークに追加

Comment

コメントを残す

*がついている欄は必須項目です。

  • Twitter
  • Facebook
  • Google Plus
  • RSS Feed