CakePHP2 認証、Auth コンポーネントのサンプルを世界一シンプルを目指して作ります。 | oki2a24 を試してみましたけれども、これをもう一度勉強したいですの。
ポイントは次の認証コンポーネントの AuthComponent::allow() ですの♪
今回は、bake を使って認証していないとアクセスできないサイトのサンプルを、やはりシンプルさとお手軽に体験できることを目指して作ります。
- Composer で CakePHP2.5.4 をインストール
- Apache、MySQL
0.作るサイトの仕様を決めます
ログインページ、ログアウトページ以外に、4種類のページ(CakePHP のコントローラー)とそれぞれのページに対して一覧、詳細、登録、編集、削除ページ(CakePHP のアクション)を設けた、合計16ページです。
認証要否一覧表
No | ページ名 | 一覧 | 詳細 | 登録 | 編集 | 削除 |
1 | users | 要 | 要 | – | 要 | 要 |
2 | articles | – | – | 要 | 要 | 要 |
3 | letters | – | 要 | 要 | 要 | 要 |
4 | posts | 要 | 要 | 要 | 要 | 要 |
認証が、ログインがなら「要」
ちなみに、モデルの名前を何にしようかと悩んでいる時に、article はなかなか出てきませんでしたから、ちょっとした勉強も兼ねて意味を載せておきますの。
article 〔雑誌や新聞の〕記事、論説、論文◆小説などのフィクションを含まない。
1−1.準備!CakePHP のモデル、リレーション、MySQL のデータベースまわり
articles、letters、posts テーブルに user_id カラムを持たせ、users テーブへの外部キーとします。
モデルのリレーションは次のようになります。
- User hasMany Article
- User hasMany Letter
- User hasMany Post
- Article belongsTo User
- Letter belongsTo User
- Post belongsTo User
ER 図はこうなります。
そして、実際のテーブル定義 SQL 文です。データベースに次のテーブルを作っておきます。
CREATE TABLE users ( id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY, username VARCHAR(255) NOT NULL UNIQUE, password CHAR(40) NOT NULL, created DATETIME, modified DATETIME ); CREATE TABLE articles ( id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY, user_id INT(11) NOT NULL, title VARCHAR(255) NOT NULL, body TEXT, created DATETIME, modified DATETIME ); CREATE TABLE letters ( id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY, user_id INT(11) NOT NULL, title VARCHAR(255) NOT NULL, body TEXT, created DATETIME, modified DATETIME ); CREATE TABLE posts ( id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY, user_id INT(11) NOT NULL, title VARCHAR(255) NOT NULL, body TEXT, created DATETIME, modified DATETIME );
1−2.準備!認証サンプルを試す前の段階。それぞれのテーブルに対応したモデル、ビュー、コントローラーを作って準備♪
作業を始めるために、CakePHP をインストールしたルートディレクトリへと移動します。例えば、こう。
cd /var/www/html/cake4/
それでは認証の部分以外の部分、つまりログイン、ログアウトを除いたすべてのアクションは bake all コマンドで作ってしまいましょう。
Console/cake bake all
User、Article、Letter、Post のモデル、コントローラー、ビューを自動生成します。その時の様子は例えば次のようになります。
1−3.トップページを Articles コントローラーの index アクションに変更
ウェブブラウザから CakePHP のルートディレクトリへアクセスしますと、CakePHP がインストールされたことを示すページが表示されます。インストールが確実に終わったことを確認できて良いのですけれども、ずっとこのままではアプリとしては役に立ちません。
そこで、トップページにアクセスしたら、Article コントローラーのindex アクション、つまり Article の一覧ページを表示するように変更します。
vim Config/routes.php
元々ルーティング設定行をコメントにして、新しい設定をその下に記述しています。
// Router::connect('/', array('controller' => 'pages', 'action' => 'display', 'home')); Router::connect('/', array('controller' => 'articles', 'action' => 'index'));
2−1.作る♪CakePHP の認証が不要なページを設定するポイント
以上で準備は整いました。これから認証コンポーネントを実装し、そしてログインが不要なページを設定していきますの。
まずはポイントです。Auth コンポーネントは全てのアクションに対して認証が必要とみなします。認証が不要なアクション、つまり認証が不要なページは明示的に指定する必要があります。
- users の登録 → $this->Auth->allow(‘add’);
- articles の一覧、詳細 → $this->Auth->allow(‘index’,’view’);
- letters の一覧 → $this->Auth->allow(‘index’);
このポイントが理解できれば、本投稿でやりたい事はほとんどできたようなものですわ♪
2−2.作る♪Auth コンポーネントを追加!どのページにアクセスしようとしてもログインページにリダイレクトされるようになる!
- ログインアクションを追加
- ログアウトアクションを追加
- ログインビューを追加
- ユーザー登録時はパスワードをハッシュ化する処理を追加
- 認証コンポーネントを追加
以上のことを1つづつ進めてまいります。
2−2−1.【Auth 導入!】ログインアクションを追加。ついでに、ログアウトアクションを追加
ログイン、ログアウトのアクションは、どちらも Users コントローラーへの追加ですので、まとめて行ってしまいます。
vim Controller/UsersController.php
アクションの中身は、公式チュートリアルからそのまま使用いたしました。ログアウトはこちらのリンクから確認できますの。
/** * ログインを行います。 * * @return void */ public function login() { if ($this->request->is('post')) { if ($this->Auth->login()) { return $this->redirect($this->Auth->redirect()); } $this->Session->setFlash(__('Your username or password was incorrect.')); } } /** * ログアウトを行います。 * * @return void */ public function logout() { $this->Session->setFlash('Good-Bye'); $this->redirect($this->Auth->logout()); }
2−2−2.【Auth 導入!】ログインビューを追加
ログインのビューとなるファイルを追加いたします。
vim View/Users/login.ctp
ログインフォーム以外に、ユーザー登録ページヘのリンクも最後に追加しておきます。
<?php echo $this->Form->create('User', array('action' => 'login')); echo $this->Form->inputs(array( 'legend' => __('Login'), 'username', 'password' )); echo $this->Form->end('Login'); echo $this->Html->link(__('New User'), array('action' => 'add')); ?>
あら?ログアウトのビューは必要ないのかしら?と思われたかもしれません。
そう、不要ですの。ログアウトしますとログインページへリダイレクトし、そのページでログアウトした旨のメッセージを表示いたします。
2−2−3.【Auth 導入!】ユーザー登録時はパスワードをハッシュ化する処理を追加
サンプルアプリですけれども、パスワードを登録や更新した時は暗号化してデータベースへ保存する、いわば「常識」なことを行います。Auth コンポーネントもパスワードがハッシュ化されていることを期待されているそうですの♪
データベースへ登録する前の処理ですので、修正する場所は、、、そう、モデルですの!
vim Model/User.php
こちらの処理も、公式チュートリアルからそのまま使用しております。
/** * beforeSave * * @return void */ public function beforeSave($options = array()) { $this->data['User']['password'] = AuthComponent::password($this->data['User']['password']); return true; }
2−2−4.【Auth 導入!】認証コンポーネントを追加
基底クラスである AppController に Auth コンポーネントをロードすることにより、全てのコントローラーで Auth を有効に致します。
vim Controller/AppController.php
DebugKit や Session もございますが、最低 Auth が入っていればよいですの。いえ、Session も入れませんとログインやログアウト時などにメッセージが表示されずエラーとなりますので、Session も必要ですわね。
/** * Components * * @var array */ public $components = array( 'DebugKit.Toolbar', 'Auth', 'Session' );
以上でログイン・ログアウトページの追加、そして Auth コンポーネントを導入することができました。
ただし、実際にウェブブラウザからページにアクセスしようとしてみますとわかりますけれども、この追加によってどのページにアクセスしようとしてもログインページにリダイレクトされます。
このままでは認証が不要としたい User の登録ページ、Article の一覧ページ、詳細ページ、そして Letter の一覧ページにログインしない限りアクセスすることができません。
しかも、User の登録ページすらアクセスできなのですから、ログインするためのユーザを作ることもできません><。
2−3.作る♪認証不要なページを各コントローラーに設定いたします!
ログイン不要なアクションのあるコントローラークラスの beforeFilter 関数に、どのアクションが不要であるのかを設定していきます。
本サンプルでは、Users コントローラー、Articles コントローラー、Letters コントローラーとなります。Posts コントローラーはすべてのアクションで認証が必要とするため、一切設定いたしません。
2−3−1.【認証不要設定!】Users コントローラー
vim Controller/UsersController.php
/** * beforeFilter * * @return void */ public function beforeFilter() { parent::beforeFilter(); // 登録(add)は認証不要 $this->Auth->allow('add'); }
2−3−2.【認証不要設定!】Articles コントローラー
vim Controller/ArticlesController.php
/** * beforeFilter * * @return void */ public function beforeFilter() { parent::beforeFilter(); // 一覧(index)と詳細(View)は認証不要 $this->Auth->allow('index','view'); }
2−3−3.【認証不要設定!】Letters コントローラー
vim Controller/LettersController.php
/** * beforeFilter * * @return void */ public function beforeFilter() { parent::beforeFilter(); // 一覧(index)は認証不要 $this->Auth->allow('index'); }
以上です。
これでユーザーが登録できるようになり、そして認証が不要と設定したページには未ログイン時でもアクセスできるようになりましたわ♪
おわりに
公式サイトのブログチュートリアルや、ACLを制御するシンプルなアプリケーションページを学びますと、ログイン、ログアウトができるようになります。
本投稿では、それをさらに一歩だけ進めて認証が必要なページ、不要なページを設定する方法を学びました。
実は同じ試みは以前にも行っていましたね。
CakePHP にある程度慣れて、bake コマンドに手を伸ばせるようになってきますと、本投稿のやり方の方がシンプルに作れることに気が付きました。
CakePHP を最近になってまた触り始めましたので、以前とは違ったアプローチで取り組みましたの♪
楽しかったですわ♪
以上です。