CakePHP 2.4.6 でユーザ管理アプリを作る方法

CakePHP 2.4.6 がリリースされていたので、簡単なユーザ管理アプリを作ってみました。

大まかな手順は次の通りです。

  • テーブル作成
  • CakePHPのディレクトリ用意
  • Apacheの設定
  • CakePHPの設定
  • bakeでアプリ作成
  • Authコンポーネントを使った認証機能も追加しました。サンプルなので、DBのアカウント情報がセキュリティ的に弱いとかありますが、そのあたりは実際に使いたい場合は改善が必要ですね。

    テーブル作成
    使うSQL文は下記。usersテーブルはカスタマイズもできますが、とりあえず認証アプリを作ってみたいだけなら、このままで作るのが簡単です。

    create database user_app_v246 character set utf8;
    grant all on user_app_v246.* to cakephp@localhost identified by 'cakephp';
    use user_app_v246;
    CREATE TABLE `users` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `username` tinytext COLLATE utf8_unicode_ci NOT NULL,
      `password` tinytext COLLATE utf8_unicode_ci NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
    

    cakephpのディレクトリ用意
    CentOS6にCakePHP2の環境を用意したVagrant Box | hiro345」で紹介しているcent6-cakephp2.boxを使っている前提です。また、/vagrant/cakephp-2.4.6.zip へCakePHP2.4.6のZIPファイルをhttps://github.com/cakephp/cakephp/zipball/2.4.6からダウンロードしてあるとします。下記のようにして、cakephp-2.4.6.zipを展開します。

    #!/bin/sh
    mkdir -p /var/www/cakephp2_apps/cakephp-2.4.6_apps
    cd /var/www/cakephp2_apps/cakephp-2.4.6_apps
    sudo unzip /vagrant/cakephp-2.4.6.zip 
    sudo mv cakephp-2.4.6 user_app
    

    Apacheの設定
    /etc/httpd/conf.d/cakephp.conf へ次のように設定を追加します。

    $ tail -9 /etc/httpd/conf.d/cakephp.conf
    Alias /cakephp2_apps/user_app_v246 /var/www/cakephp2_apps/cakephp-2.4.6_apps/user_app/app/webroot
    <Directory /var/www/cakephp2_apps/cakephp-2.4.6_apps/user_app/app/webroot>
        AllowOverride All
    </Directory>
    <Location /cakephp2_apps/user_app_v246>
        Options Indexes FollowSymLinks
        Order allow,deny
        Allow from all
    </Location>
    

    設定したら、Apacheの再起動。

    $ sudo service httpd configtest
    Syntax OK
    $ sudo service httpd graceful
    

    CakePHPの設定
    URLにあわせて、.htaccess ファイルを変更します。3つあります。

    $ cd /var/www/cakephp2_apps/cakephp-2.4.6_apps/user_app/
    $ cat .htaccess
    <IfModule mod_rewrite.c>
       RewriteEngine on
       RewriteBase /cakephp2_apps/user_app_v246
       RewriteRule    ^$ app/webroot/    [L]
       RewriteRule    (.*) app/webroot/$1 [L]
    </IfModule>
    
    $ cat app/.htaccess
    <IfModule mod_rewrite.c>
        RewriteEngine on
        RewriteBase /cakephp2_apps/user_app_v246
        RewriteRule    ^$    webroot/    [L]
        RewriteRule    (.*) webroot/$1    [L]
    </IfModule>
    
    $ cat app/webroot/.htaccess
    <IfModule mod_rewrite.c>
        RewriteEngine On
        RewriteBase /cakephp2_apps/user_app_v246
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteRule ^ index.php [L]
    </IfModule>
    

    セキュリティソルトを指定。デフォルトの値だと警告がでるので、適当な値へ変更。下記は例です。

    $ cat app/Config/core.php |grep Security
    	//Configure::write('Security.salt', 'DYhG93b0qyJfIxfs2guVoUubWwvniR2G0FgaC9mi');
    	Configure::write('Security.salt', '90e72b13df21f69cf036cd8d14e186d2ebcd1c7e');
    	//Configure::write('Security.cipherSeed', '76859309657453542496749683645');
    	Configure::write('Security.cipherSeed', '71327750978516098898932779760');
    

    CakePHP2を展開したディレクトリにある app/Config/database.php.default をコピーして、/Config/database.php へ置きます。下記のようなスクリプトファイル create_database_php.sh を用意して実行すれば良いでしょう。

    #!/bin/sh
    BASE_DIR=/var/www/cakephp2_apps/cakephp-2.4.6_apps
    APP=${BASE_DIR}/user_app
    cat ${APP}/app/Config/database.php.default  \
     | sed -e "s%'login' => 'user'%'login' => 'cakephp'%" -  \
     | sed -e "s%'password' => 'password'%'password' => 'cakephp'%" -  \
     | sed -e "s%'database' => 'database_name'%'database' => 'user_app_v246'%" -  \
     | sed -e "s%//'encoding'%'encoding'%" -  \
     > ${APP}/app/Config/database.php
    

    実行します。

    $ sh create_database_php.sh 
    

    ここまでやったら、CakePHP2.4.6の基本設定はできているので、http://192.168.91.10/cakephp2_apps/user_app_v246/ へアクセスして動作確認します。CakePHP2のデフォルト画面が表示されれば成功です。

    DebugKitのインストール
    cakephp/debug_kit · GitHub https://github.com/cakephp/debug_kit のインストールもしておくと便利なのでやっておきます。

    $ wget -O debug_kit_2.2.3.zip https://github.com/cakephp/debug_kit/archive/2.2.3.zip
    $ unzip debug_kit_2.2.3.zip 
    $ mv debug_kit-2.2.3 app/Plugin/DebugKit
    

    app/Plugin/DebugKit/ディレクトリが下記の通りになっていれば良いです。

    $ ls -1 app/Plugin/DebugKit/
    Console
    Controller
    Lib
    Locale
    Model
    README.mdown
    Test
    View
    build.py
    webroot
    

    有効にするためには、app/Config/bootstrap.php へロード処理の追加が必要です。

    $ tail -1 app/Config/bootstrap.php 
    CakePlugin::load('DebugKit');
    

    また、app/Controller/AppController.php へコードの追加が必要です。

    $ tail -3 app/Controller/AppController.php 
    class AppController extends Controller {
        public $components = array('DebugKit.Toolbar');
    }
    

    最後にsql_dumpと衝突するので、sql_dumpの処理をViewから削除しておきます。

    $ cp -a app/View/Layouts/default.ctp app/View/Layouts/default.ctp.original
    $ sed -i "s%<?php echo \$this->element('sql_dump'); ?>%%" app/View/Layouts/default.ctp
    

    http://192.168.91.10/cakephp2_apps/user_app_v246/ へアクセスすると、DebugKitのツールバーのアイコンが右側に追加されていて、クリックするとツールバーが表示されるようになっていることがわかります。動かない場合はエラーメッセージを確認して対応をしてください。

    bakeでアプリ作成
    UserのMVCは下記コマンドで生成します。

    $ cd app
    $ sudo ./Console/cake bake all User
    

    パスワード暗号化対応
    2.4からパスワード暗号化対応はユーザが指定するようになったので、Model/User.phpを修正

    App::uses('SimplePasswordHasher', 'Controller/Component/Auth', 'AppModel', 'Model');
    
    class User extends AppModel {
        // 略
        public function beforeSave($options = array()) {
            if (!$this->id) {
                $passwordHasher = new SimplePasswordHasher();
                $this->data['User']['password'] = $passwordHasher->hash($this->data['User']['password']);
            }
            return true;
        }
    }
    

    adminユーザ登録
    http://192.168.91.10/cakephp2_apps/user_app_v246/users へアクセスをして、ユーザ admin をパスワード password で登録しておきます。ユーザ名、パスワードは他のものでもかまいません。

    ユーザ認証
    ユーザを認証する機能を追加します。次の例では、Controller/AppController.php では Authコンポーネントの利用を追加しています。この指定で「SimplePasswordHasher」を使って、sha256のハッシュタイプでパスワードは暗号化されているとして認証をするということになるようです。

    $ tail -15 Controller/AppController.php 
    class AppController extends Controller {
        //public $components = array('DebugKit.Toolbar');
        public $components = array('DebugKit.Toolbar',
          'Auth' => array(
              'authenticate' => array(
                'Form' => array(
                    'passwordHasher' => array(
                        'className' => 'Simple',
                        'hashType' => 'sha256'
                    )
                )
              )
          ),
          'Session');
    }
    

    認証をする際にはAuthでhashTypeをsha256としているので、フィルターでハッシュの指定が必要となります。

    $ tail -23 Controller/UsersController.php 
      public function beforeFilter() {
        Security::setHash('sha256');
        $this->Auth->allow('login');
        $this->Auth->allow('logout');
        // $this->Auth->allow('add'); //ユーザ登録を制限しない場合はコメントをはずす
      }
    
      public function login() {
        if ($this->request->is('post')) {
          if ($this->Auth->login()) {
            return $this->redirect($this->Auth->redirectUrl());
    	//2.4より前は return $this->redirect($this->Auth->redirect());
          } else {
    	return $this->Session->setFlash('incorrect');
          }
        }
      }
    
      public function logout() {
        $this->Auth->logout();
        return $this->redirect('/');
      }
    }
    

    ログイン画面
    ログイン画面用に View/Users/login.ctp を作成します。

    $ cat View/Users/login.ctp
    <?php
    echo $this->Form->create('User');
    echo $this->Form->input('User.username');
    echo $this->Form->input('User.password');
    echo $this->Form->end('Login');
    ?>
    

    認証の動作確認
    ここまで出来たら、http://192.168.91.10/cakephp2_apps/user_app_v246/users/ へアクセスをすると http://192.168.91.10/cakephp2_apps/user_app_v246/users/login へリダイレクトされます。

    http://192.168.91.10/cakephp2_apps/user_app_v246/users/login でユーザ名 admin、パスワード password と入力してログインをクリックするとログインできます。

    http://192.168.91.10/cakephp2_apps/user_app_v246/users/logout へアクセスするとログアウトできます。

    PHP, CakePHPについては下記が参考になります。

    同じタグの記事: CakePHP
    同じタグの記事: PHP
    同じカテゴリの記事: Linux
    関連書籍: CakePHP
    関連書籍: PHP