ネモウスドットコム

エンジニア兼プロデューサーがWebサービス制作について考えるブログ

このサイトはかみさまのWebサービス制作研究所に移転しました。
こちらのサイトもぜひご覧ください。

CakePHP2.xでScaffoldingに(Authより)簡単な認証を実装する方法

CakePHPでのシステム開発時において、一時的にデータベースの内容を誰かに確認してほしいときがあります。 そんなとき、Scaffoldingを使えば楽に実現できますよね。

ただ、もちろん認証をかけることは必要だけど、かといって一時的に見てもらうページのためだけにAuthコンポーネントを使うのも面倒……。

そんなときに便利な、簡易的な認証をかける方法について書きます。 (あくまで簡易的なので、使用は自己責任で)

認証の流れ

認証は以下の流れで行ないます。

  1. beforeFilter()で認証済みかどうか判別する
  2. 認証済みでない場合、ログイン用のダイアログを表示する
  3. 入力されたパスワードが一致した場合は認証し、一致しない場合は2に戻る

必要なファイル

認証を実装するために必要なファイルは以下の2つだけです。

  1. /app/Controller/ScaffoldsController.php
  2. /app/View/Scaffolds/login.ctp

1. ScaffoldsController.php

まず、以下の内容のScaffoldsController.phpを作成します。

self::PASSWORDは適宜変更してください。

App::uses('AppController', 'Controller');

class ScaffoldsController extends AppController {

    public $scaffold;

    public $components = array('Session');

    /* パスワード */
    const PASSWORD = '1234';

    public function beforeFilter() {
        /* 管理権限がある場合 */
        if ($this->Session->read('is_admin')) {
            return;
        }

        /* ログインまたは認証時以外の場合 */
        if ( ($this->action != 'login') && ($this->action != 'auth')) {
            $this->redirect('login');
            exit();
        }
    }

    public function login() {
        $this->layout = false;
    }

    public function auth($password = null) {
        if ($password == self::PASSWORD) {
            $this->Session->write('is_admin', true);
            $this->redirect('index');
        } else {
            $this->redirect('login');
        }
        exit();
    }

}

2. login.ctp

次に、login.ctpを作成します。

<script>

window.onload = function() {
    location.href = './auth/' + prompt('パスワードを入力してください。');
}

</script>

おわりに

以上で、簡易的な認証を実現できます。 通常のJavaScriptのみの認証と違い、パスワードが流出する恐れがないので比較的安全な方法だと思います。

一時的なページの認証等であれば、この程度の簡単なものでもいいのではないでしょうか。