LoginSignup
2
3

More than 5 years have passed since last update.

CakePHP3で自作アプリを作ってみた part6 〜削除、ログイン、認証・認可〜

Last updated at Posted at 2018-03-12

7回に渡って記載していきます。
CakePHP3で自作アプリを作ってみた シリーズ
セミファイナルです!

今回part6では

  • 削除機能
  • ログイン 認証、認可

を解説したいと思います。

ブツはこちら公開済み。
https://cocktail-com.herokuapp.com/

データ登録が間に合わなかったので悪しからず。。。
少しづつ登録します。

今までの記事
CakePHP3で自作アプリを作ってみた part1 〜イントロ〜
https://qiita.com/m-hatano/items/61392c33fdbd49376747

CakePHP3で自作アプリを作ってみた part2 〜herokuでHello World!!まで〜
https://qiita.com/m-hatano/items/79480fa380ebc49c0209

CakePHP3で自作アプリを作ってみた part3 〜検索機能の実装〜
https://qiita.com/m-hatano/items/e85b8aa8fcaa0c3410f0

CakePHP3で自作アプリを作ってみた part4 〜登録・編集機能の実装〜
https://qiita.com/m-hatano/items/86657cf8b69fcb542d66

CakePHP3で自作アプリを作ってみた part5 〜画像アップロードの実装〜
https://qiita.com/m-hatano/items/47cd8607e19a523749f0


削除

    /**
     * カクテル削除
     */
    public function delete($id = null)
    {
        $this->request->allowMethod(['post', 'delete']);
        $cocktails = $this->Cocktails->get($id);
        if ($this->Cocktails->delete($cocktails)) {
            $this->Flash->success(__('カクテルを削除しました。'));
        } else {
            $this->Flash->error(__(MessageUtil::getMsg(MessageUtil::SAVE_ERROR)));
        }

        return $this->redirect(['action' => 'index']);
    }

簡単です。
allowMethodは認可なので後述します。

tableクラスのdeleteメソッドを使う場合は削除対象のEntityを渡します。
CocktailsController内ならば、

$this->Cocktails->get($id)

でエンティティが取得できるので、それをdeleteに渡してあげれば削除できます。
Tableクラスを見て見ればわかりますが、deleteAllというメソッドも用意されていて、こっちはwhere句として生成する条件を渡せば削除できます。

$this->Cocktails->->deleteAll(['id >' => 3]);

みたいな感じで渡せばidが3よりも大きい条件で削除できます。

ログイン 認証・認可

チュートリアル
https://book.cakephp.org/3.0/ja/tutorials-and-examples/cms/authentication.html

公式の記事がなんだかんだわかりやすいです。
Cakeに沿って作成すればここは生産性がものすごいあがるとこですね。

認証= わかりやすいところユーザのログイン認証のことです。
認可= 各アクションやページでそのユーザやログインが許可されているかの判別ってとこです。

  • Controller/AppController#initialized()
        $this->loadComponent('Auth', [
            // 認可
            'authorize' => 'Controller',
            // ログイン認証
            'authenticate' => [
                'Form' => [
                    'fields' => [
                        'username' => 'login',
                        'password' => 'password'
                    ]
                ]
            ],
            'loginAction' => [
                'controller' => 'Users',
                'action' => 'login'
            ],
            // 未認証の場合、直前のページに戻します
            'unauthorizedRedirect' => $this->referer()
        ]);

        // 未承認で許可するアクション
        $this->Auth->allow(['index', 'search', 'view']);

まずコンポーネントを読み込み、設定をします。

 ビューはこんな感じです。

<h1>管理者ログイン</h1>
<?= $this->Form->create() ?>
<?= $this->Form->control('login') ?>
<?= $this->Form->control('password') ?>
<?= $this->Form->button('ログイン') ?>
<?= $this->Form->end() ?>
  • 認可はコントローラで制御します。
  • ログイン画面のlogin, passwordの要素で認証します。
  • ログインのアクションのコントローラとアクションはこれです。
  • 未承認のときのリダイレクト先
  • 未承認でも実行できるアクション

をそれぞれ設定しています。

  • Controller/UserController.php
    /**
     * ログイン
     * POST users/login
     * @return \Cake\Http\Response|NULL
     */
    public function login()
    {
        if ($this->request->is('post')) {
            $user = $this->Auth->identify();
            if ($user) {
                $this->Auth->setUser($user);
                $this->Flash->success('ログインしました。');
                return $this->redirect($this->Auth->redirectUrl());
            }
            $this->Flash->error('ユーザー名またはパスワードが不正です。');
        }
    }

    /**
     * ログアウト
     * @return \Cake\Http\Response|NULL
     */
    public function logout()
    {
        $this->Flash->success('ログアウトしました。');
        return $this->redirect($this->Auth->logout());
    }

ログイン、ログアウトは簡潔です。
ここはCakeの呪文のように書くだけです。

$this->Auth->identify();

でAuthをロードした時に設定したfieldsを使用したログイン認証をします。
認証成功したらsetUserでセッションにユーザを設定します。
セッションの管理場所はcongig/app.phpに記載されています。

セッション参考
https://book.cakephp.org/3.0/ja/development/sessions.html

  • Controller/AppController#isAuthorized()
    /**
     * 'authorize' => 'Controller'でアクセスのたびに評価される
     * allowで許可させているアクションでは実行されない
     * {@inheritDoc}
     * @see \Cake\Controller\Controller::isAuthorized($user)
     */
    public function isAuthorized($user)
    {
        // デフォルトでは、アクセスを拒否する
        return false;
    }

ControllerのisAuthorizedをオーバーライドして認可のロジックを実装できます。
AppControllerではコントローラ共通ロジックを実装しておくといいですね。
今回は全アクションで拒否にしておいて。
各コントローラで許可する形にします。
しかし、コメントに書いてあるようにallow()してあるメソッドでは実行されません。

  • Controller/CocktailsController#isAuthorized()
    public function isAuthorized($user)
    {
        $action = $this->request->getParam('action');
        // ログイン時に許可するアクション
        if (in_array($action, ['edit', 'add', 'delete', 'mergeElementsTable', 'deleteElementsTable'])) {
            return true;
        }
        return false;
    }

ログインしていないと実行できないアクションを定義しています。
発展系としては、ログインユーザのロールを判別してアクションの実行権限を判別したりに使用できます。

allow()で常時許可の設定をしてisAuthorized()でログイン時の許可をするってとこでしょうか。


さっぱりしていますが以上です。

part6はここまでで次回ラストは

  • キャッシュ設定

を解説します。
最後までお付き合いありがとうございました!

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3