CakePHP 2.4.6 がリリースされていたので、簡単なユーザ管理アプリを作ってみました。
大まかな手順は次の通りです。
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については下記が参考になります。
- パーフェクトPHP
- Webサイト制作者のための PHP入門講座
- PHP 逆引きレシピ
- PHPによるWordPressカスタマイズブック―3.x対応
- Webアプリ開発を加速する CakePHP2定番レシピ119
- CakePHP2 実践入門 (WEB+DB PRESS plus)
- 詳解CakePHP辞典―2.0/2.1/2.2/2.3対応
- CakePHP ポケットリファレンス (Pocket Reference)