カテゴリー
コンピューター

★2回め挑戦★CakePHP2で認証、Auth コンポーネントのサンプルを世界一シンプルを目指して作ります。

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 〔雑誌や新聞の〕記事、論説、論文◆小説などのフィクションを含まない。

articleの意味・用例|英辞郎 on the WEB:アルク

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 図はこうなります。

cake.png

そして、実際のテーブル定義 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 のモデル、コントローラー、ビューを自動生成します。その時の様子は例えば次のようになります。

スクリーンショット 2014-10-08 21.24.51.png

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 を最近になってまた触り始めましたので、以前とは違ったアプローチで取り組みましたの♪

楽しかったですわ♪

以上です。

コメントを残す