CakePHP2 ざっくりとベーシック認証

CakePHP2.4で、見せたくないページにちょっとベーシック認証を掛けたかっただけなのに、妙にハマった。
「CakePHP2では、簡単にベーシック認証をかけれる。」らしいのに・・・。
実際、なんということはなかったが、他の認証の情報とか、CakePHP1と勘違いしたりで、ハマった。

さて、CakePHP2でのベーシック認証だが、ステップは以下のとおり。

  1. データベースにusersテーブルを作る。
  2. usersテーブルに対応したUserモデルを作る。
  3. Userモデルに対応したUsersContollerを作って、ユーザーを作る。
  4. 見せたくないページにAuthコンポーネントでBasicをかける。

とりあえず、手順をざっくり記述していく。

1.データベースにusersテーブルを作る。

こんなかんじかな。

CREATE TABLE IF NOT EXISTS users(
id bigint unsigned PRIMARY KEY AUTO_INCREMENT ,
username varchar( 256 ) NOT NULL ,
password varchar( 256 ) NOT NULL ,
created datetime NOT NULL ,
modified datetime NOT NULL
) ENGINE = InnoDB DEFAULT CHARSET = utf8

カラム名は特に理由がないかぎり変更せずに、usernameとpasswordでにしておくと良い。
createdとmodifedも、とりあえず一緒つけとけばCakeが勝手に使うので、入れおく。

これで、ユーザーを管理するテーブルを作る。

2.usersテーブルに対応したUserモデルを作る。

さて、次に対応するモデルを作る。

<?php
App::uses('AuthComponent', 'Controller/Component');
class User extends AppModel {
    public function beforeSave($options = array()) {
        $this->data['User']['password'] = AuthComponent::password($this->data['User']['password']);
        //parent::beforeSave($options);
        return true;
    }
}

こんな感じ。

パスワードをデータベースにそのまま保存せずに、暗号化(ハッシュ化)して保存する。
AuthComponent::password を使えば、ハッシュ化されてパスワードは保存される。

 

3.Userモデルに対応したUsersContollerを作って、ユーザーを作る。

さて、次にログインするユーザーを作成するために、Userモデルを扱うコントローラーを作成する。

ユーザーがいないとそもそもログインできないしね。

以下の様なコントローラーを作る。

<?php

class UsersController  extends AppController{
    public $scaffold = "";
}

Userモデルを扱うUsersControllerを作成し、変数名$scaffoldを宣言。
あとは、このコントローラーにアクセスすれば、usersテーブルを扱う諸々ができているはずなので、そこでユーザーを作成する。

 

4.見せたくないページにAuthコンポーネントでBasicをかける。

さて、いよいよ本題になる。

ベーシック認証をかけたいページに、Authコンポーネントを読み込みんで、beforeFilterで割り付ける。

class HogeController extends AppController{
    public $components = array('Session','Auth');
    
    public function beforeFilter() { 
        parent::beforeFilter();
        
        //Basic Auth
        $this->Auth->authenticate = array('Basic');
    }

これで、Hogeコントローラーにはベーシック認証がかかる。

サイト全体にかけたければ、AppControllerのbeforeFilterに同じように書けば良い。

もし、基本見せてもいいが、管理ページは見せたくないって場合は、

<?php
class ManagerAppController extends AppController {
    
    public $components = array('Session','Auth');
    
    public function beforeFilter() {
        parent::beforeFilter();
        
        //Basic Auth
        $this->Auth->authenticate = array('Basic');   

    }
}

こんな風に、AppControllerを継承してもう一つ作ったものを継承したコントローラーにすればよいと思う・・・。
(他に、やり方あるらしいけど。)

ちなみに、ベーシック認証は平文でパスワードを送るらしいので、送信経由で盗聴されると、そのままパスワードが見られるらしい。
まぁ、多くの人が、ドアが閉まってればガラスを割って入ろうとは思わないので、ないよりはマシだと思う。

Leave a Reply

Your email address will not be published.

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>