読者です 読者をやめる 読者になる 読者になる

ITの隊長のブログ

ITの隊長のブログです。いや、まだ隊長と呼べるほどには至っていないけど、日々がんばります。CakePHPとPlayFrameworkを使って仕事しています。最近はAngular2をさわりはじめたお(^ω^ = ^ω^)

【CakePHP】AuthComponentとprefix routingを使った複数のログイン認証・ユーザー

CakePHP CakePHP2.x PHP

スポンサードリンク

通常のページでは通常ユーザー、管理画面は管理者ユーザーって要件があって、CakePHPで対応するにはどうすれば良いのかを探して実装してみた。

github.com

下記記事が参考なりました。ありがとうございますm(_ _ )m

prefix routing

ルーティング — CakePHP Cookbook 2.x ドキュメント

ドキュメントを読んでも良いが、下の記事がわかりやすかった。

qiita.com

記事にあるとおり、CakePHPは、URLを認識て、prefix(接頭辞)をつけることができる。

この場合ControllerのAction名が指定したprefixの値が接頭辞になるので、その点だけ注意。

複数ログイン認証

d.hatena.ne.jp

要は、prefix routingで付与された値が管理者ユーザーであるかどうかの判断を~/app/Controller/AppController.phpbeforeFilter()で確認して、layoutなどを変更する。

その中で、AuthComponentの値も変更して、管理ユーザーと通常ユーザーの認証を分ければ良い。

github.com

<?php

...
  public function beforeFilter()
  {
    // prefixが"admin"であれば
    if (isset($this-params['prefix']) && $this->params['prefix'] === 'admin') {
      $this->layout = 'admin'; // layoutファイルを管理画面用に
      $this->_setAdminAuthParameter(); // Auth Componentのパラメータを管理用へ変更
    }
    parent::beforeFilter();
  }

  private function _setAdminAuthParameter() {
    $this->Auth->authenticate = [
      'Form' => [
        'userModel' => 'AdminUser',
        'passwordHasher' => 'Blowfish',
        'fields' => [
          'username' => 'email'
        ]
      ]
    ];
    $this->Auth->loginAction = [
      'controller' => 'users',
      'action' => 'admin_login',
      'admin' => true
    ];
    $this->Auth->loginRedirect = [
      'controller' => 'admin_users',
      'action' => 'admin_index',
      'admin' => true
    ];
    $this->Auth->logoutRedirect = [
      'controller' => 'users',
      'action' => 'admin_login',
      'admin' => true
    ];
    AuthComponent::$sessionKey = "Auth.Owner";
  }

また他のタイプのユーザーが必要になったとしても、prefixの値は配列にして増やすことができるので、大丈夫だと思う。