2014年10月11日追記
再び勉強してみましたの♪今度は bake を使用してもっと楽にサンプルを作成することができましたわ♪
★認証のお勉強内容
ログインしないとページにアクセスできないようにする、認証機能を勉強します。同時に、認証が不要なページを設ける方法も確かめます。できるだけシンプルな構造でいきます!
では、次のような認証前後でアクセスできるできないページ、を作成してみます。ログイン用のユーザは、1人だけ作ります。
URL はこんな感じです。
- ログインページ
- http://localhost/cakesample3/users/login
- ログイン前後でアクセスできたりできなくなったりするページ
- http://localhost/cakesample3/apples
- http://localhost/cakesample3/beets
- http://localhost/cakesample3/cherries
今回のサンプルを動かすと、ログイン前後でどのページにアクセスできて、どのページにアクセスできないのかをまとめた表です。
ページ | ログイン前にアクセスできる | ログイン後にアクセスできる |
---|---|---|
apples | × | ○ |
beets | × | ○ |
cherries | ○ | ○ |
★前提・設定
使用 CakePHP バージョン
- CakePHP 2.2.0
ログイン用ユーザ
CakePHP の認証時に入力する情報を次のようにします。
- ユーザ名 username
- パスワード password
データベース設定
ユーザ名などはデータベースに入れるので、その情報を予め決めておきます。
- データベース種類 MySQL
- データベースユーザ sampleuser3
- データベースパスワード samplepassword3
- データベース名 sampledb3
- データベースエンコード utf8
★パスワードを自力で作る。
本や、ネットのサンプルではたいていユーザ登録のアクションなどもあわせて紹介されております。が、もっとシンプルに認証前後のページアクセス時の動きを見ることに集中したいので作りません。
ですので、SQL を直接打って、ユーザを登録します。
ここでポイントです。パスワードは、暗号化して登録します。
そのため、ソルト値というものが必要となります。CakePHP のソルト値を設定しているソースはこちらです。
- /cakesample3/app/Config/core.php
/** * A random string used in security hashing methods. */ Configure::write('Security.salt', 'CSyiZD1w0zBtWiunS7WY2ZOyc2BScf2MJW7CBiRF8SoHwrTRu8');
では、実際に暗号化します。まず準備として、コマンドプロンプトを起動したら、PHP へのパスを通します。わたくしの環境は、環境変数に設定していないのでその都度追加です。
cd C:\pleiades\xampp\php set path=%path%;%cd%
暗号化方式は sha256 ではなく、デフォルトは sha1 です。sha1 を使いましょう。
また、Windows のコマンドプロンプトと、Linux のコマンドでは php コマンドの使い方が若干違うようです。
わたくしの環境は Windows であり、次のようなコマンドとなりました。
php -r "echo hash('sha1','CSyiZD1w0zBtWiunS7WY2ZOyc2BScf2MJW7CBiRF8SoHwrTRu8password');"
hash 関数の第2引数、長い!、がパスワード部分となります。ソルト値の後ろにパスワードを付けた文字列を暗号化します。
できたパスワードはこちらになりました。
f2851182a7e0ac3df147f08446f16d766c8ea44b
これがパスワードですので、直接 SQL でテーブルに挿入します。
INSERT INTO `sampledb3`.`user` (`id`, `username`, `password`, `created`, `modified`) VALUES (NULL, 'username', 'f2851182a7e0ac3df147f08446f16d766c8ea44b', NULL, NULL);
※おまけ Linux ver
Windows と Linux で、php を範囲を指定するクォーテーションが違います。地味にはまりますので注意です。
php -r 'echo(hash("sha1","CSyiZD1w0zBtWiunS7WY2ZOyc2BScf2MJW7CBiRF8SoHwrTRu8password"));'
★ MySQL ソース
準備として、コマンドプロンプトにて MySQL へのパスを通します。
cd C:\pleiades\xampp\mysql\bin set path=%path%;%cd%
root で MySQL にアクセスして、データベース、ユーザ、を作成します。パスワードを設定します。
GRANT ALL PRIVILEGES ON sampledb3.* TO sampleuser3@localhost IDENTIFIED BY 'samplepassword3'; FLUSH PRIVILEGES; CREATE DATABASE sampledb3 CHARACTER SET utf8;
続いて、認証用のデータを格納するテーブルを作成します。うっかり MySQL からログアウトし手しまいましたので、mysql -u sampleuser3 -psamplepassword3 sampledb3 のコマンドを打つことで、作ったユーザ、パスワード、データベースにアクセスして作ります。
# ユーザテーブル CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(50) NOT NULL, `password` varchar(50) NOT NULL, `created` datetime DEFAULT NULL, `modified` datetime DEFAULT NULL, PRIMARY KEY (`id`) )DEFAULT CHARSET=utf8;
★CakePHP ソース一覧
認証
■モデル
- /cakesample3/app/Model/User.php
■コントローラ
- /cakesample3/app/Controller/AppController.php
- /cakesample3/app/Controller/UsersController.php
■ビュー
- /cakesample3/app/View/Users/login.ctp
表示するだけのページ
■モデル
- なし
■コントローラ
- /cakesample3/app/Controller/ApplesController.php
- /cakesample3/app/Controller/BeetsController.php
- /cakesample3/app/Controller/CherriesController.php
■ビュー
- /cakesample3/app/View/Apples/index.ctp
- /cakesample3/app/View/Beets/index.ctp
- /cakesample3/app/View/Cherries/index.ctp
■エレメント
- /cakesample3/app/View/Elements/all_links.ctp
★ソース詳細
認証
■モデル
- /cakesample3/app/Model/User.php
<?php App::uses('AppModel', 'Model'); /** * User Model * */ class User extends AppModel { /** * Use table * * @var mixed False or table name */ public $useTable = 'user'; }
■コントローラ
既存のソースにハイライト部分を追加します。
- /cakesample3/app/Controller/AppController.php
<?php /** * Application level Controller * * This file is application-wide controller file. You can put all * application-wide controller-related methods here. * * PHP 5 * * CakePHP(tm) : Rapid Development Framework (http://cakephp.org) * Copyright 2005-2012, Cake Software Foundation, Inc. (http://cakefoundation.org) * * Licensed under The MIT License * Redistributions of files must retain the above copyright notice. * * @copyright Copyright 2005-2012, Cake Software Foundation, Inc. (http://cakefoundation.org) * @link http://cakephp.org CakePHP(tm) Project * @package app.Controller * @since CakePHP(tm) v 0.2.9 * @license MIT License (http://www.opensource.org/licenses/mit-license.php) */ App::uses('Controller', 'Controller'); /** * Application Controller * * Add your application-wide methods in the class below, your controllers * will inherit them. * * @package app.Controller * @link http://book.cakephp.org/2.0/en/controllers.html#the-app-controller */ class AppController extends Controller { /** * Array containing the names of components this controller uses. Component names * should not contain the "Component" portion of the classname. * * @var array */ public $components = array( // Auth 'Auth' => array( 'loginRedirect' => array('controller' => 'apples', 'action' => 'index'), 'logoutRedirect' => array('controller' => 'users', 'action' => 'login'), 'authError' => 'このページを表示するには、ログインを行ってください。', 'authenticate' => array( 'all' => array( 'fields' => array( 'username' => 'username', 'password' => 'password', ), ), 'Form', ), ), // セッション 'Session', ); }
- /cakesample3/app/Controller/UsersController.php
<?php App::uses('AppController', 'Controller'); /** * Users Controller * * @property User $User */ class UsersController extends AppController { /** * Called before the controller action. You can use this method to configure and customize components * or perform logic that needs to happen before each controller action. * * @return void */ public function beforeFilter() { // ログインなしでアクセス可能なページ(このコントローラーのアクション)を列挙 $this->Auth->allow('logout'); } /** * ログイン処理 */ public function login() { // フォームに入力があった場合のみログイン処理を行い、ダッシュボードへ移動 if ($this->request->is('post')) { if ($this->Auth->login()) { $this->redirect(array('controller' => 'apples', 'action' => 'index')); } else { $this->Session->setFlash(__('ユーザ名またはパスワードが誤っています。再度入力してください。')); } } } /** * ログアウト処理 */ public function logout() { $this->redirect($this->Auth->logout()); } }
■ビュー
- /cakesample3/app/View/Users/login.ctp
<h2>Users login ビュー</h2> <div class="users form"> <?php echo $this->Session->flash('auth'); ?> <?php echo $this->Form->create('User');?> <fieldset> <legend> <?php echo __('ユーザ名とパスワードを入力してください。'); ?> </legend> <?php echo $this->Form->input('username'); echo $this->Form->input('password'); ?> </fieldset> <?php echo $this->Form->end(__('ログイン'));?> </div> <?php echo $this->element('all_links'); ?>
表示するだけのページ
■モデル
- なし
■コントローラ
クラス名、ファイル名以外は全部同じです。なので最初の ApplesController.php のみ掲載します。
- /cakesample3/app/Controller/ApplesController.php
- /cakesample3/app/Controller/BeetsController.php
- /cakesample3/app/Controller/CherriesController.php
<?php /** * Apples Controller * * @property Apple $Apple */ class ApplesController extends AppController { /** * index method * * @return void */ public function index() { } } ?>
■ビュー
こちらも、コントローラーと同様、ほぼ同じですので Apples 以外のビューは省略します。
- /cakesample3/app/View/Apples/index.ctp
- /cakesample3/app/View/Beets/index.ctp
- /cakesample3/app/View/Cherries/index.ctp
<h2>Apples ビュー</h2> <?php echo $this->element('all_links'); ?>
■エレメント
- /cakesample3/app/View/Elements/all_links.ctp
<div class="actions"> <h3>リンク</h3> <ul> <?php echo "<li>" . $this->Html->link('ログイン', array('controller' => 'users', 'action' => 'login')) . "</li>"; echo "<li>" . $this->Html->link('ログアウト', array('controller' => 'users', 'action' => 'logout')) . "</li>"; echo "<li>" . $this->Html->link('Apples', array('controller' => 'apples', 'action' => 'index')) . "</li>"; echo "<li>" . $this->Html->link('Beets', array('controller' => 'beets', 'action' => 'index')) . "</li>"; echo "<li>" . $this->Html->link('Cherries', array('controller' => 'cherries', 'action' => 'index')) . "</li>"; ?> </ul> </div>
★おわりに
パスワード生成のために Windows コマンドプロンプトで PHP を実行するときに役に立ったページです。ありがとうございます!
「CakePHP2 認証、Auth コンポーネントのサンプルを世界一シンプルを目指して作ります。」への5件の返信
[…] CakePHP2 認証、Auth コンポーネントのサンプルを世界一シンプルを目指して作ります。 | oki2a24 のソースをいじってサンプルを作っていきます。 […]
[…] 暗号化したものを INSERT します。暗号化方法は、CakePHP2 認証、Auth コンポーネントのサンプルを世界一シンプルを目指して作ります。 | oki2a24 の★パスワードを自力で作る。を参照くださ […]
[…] で試しました。コマンドプロンプトでの PHP の実行方法は、以前の投稿の CakePHP2 認証、Auth コンポーネントのサンプルを世界一シンプルを目指して作ります。 | oki2a24 を参考にしました。 […]
同じようにしてもログインできなかったぞー。うそつき。
コメントありがとう存じます。こちらの投稿も参考になるやもしれませんわ。 → ★2回め挑戦★CakePHP2で認証、Auth コンポーネントのサンプルを世界一シンプルを目指して作ります。 | oki2a24 https://oki2a24.com/2014/10/11/make-ultra-simple-auth-sample-with-cakephp2-2/