Ich habe hunger

あふりかエンジニア、アフリカ向けのB2BのSaaSを開発する

Cakephp2.xで複数のログインを実装する方法

ユーザーがログインするシステムを作ってると

どうしても、adminもログインして管理画面を持つようになりますよね。

そこに対して、別のモデルでのログイン機構を作るのに手間取ってました。

が、良い記事を見つけて解決出来そうです。

1ヶ月前になんで見つけられなかったんだろうなぁ(´・ω・`)



ともあれ、ユーザーと管理者を別モデルで実装しながら

ふたつともログイン機能をつけたい、という長年の夢がさくっと叶いそうです。

もともとのアイデア

AppController
├ UserAuthController
│├ PagesController
│└ UsersController
└ AdminAuthController
 └ AdminController
という形で、AppControllerをextendsして

Auth用のControllerを作り、
そこでAuthComponentの設定を書いておく。
それをさらに継承する形で通常のコントローラーを記述する。

という形でした。

恐らく、まだ解消されてないと思うんですが、
2段階ぐらい継承するとうまくAppControllerで定義したものが
継承されなかったり、_mergeParentみたいな変数を
上書きしてやったりしないといけませんでした。

見つけたアイデア(というか機能)

CakePHP 2.xのプレフィックスルーティングを有効にし、レイアウトを変える方法 | 大輔べ

【CakePHP 2.x】複数モデルでAuthコンポーネントを使う - pospomeのプログラミング日記



プレフィックスルーティングというやつ。

core.phpの中で設定を変えてあげると

指定したprefixがついたroutingが生成される、というもの。

例えばadminだと

// prefixなし
$this->connect("/users/login", array('controller' => 'users', 'action' => 'login'));

// prefixあり
$this->connect("/admin/users/login", array('controller' => 'users', 'action' => 'login', 'prefix' => 'admin', $prefix => true));

/users/loginに対して、/admin/users/loginが生成されます。



で、これで何が出来るかっていうと、
beforeFilter()でprefixが何かを判別したりして、
layoutを変えたり、authを動的に書き換えたり出来ます。

function beforeFilter() {
  if (isset($this->params['prefix']) && $this->params['prefix'] == 'admin') {
    $this->layout = 'admin'; // 例えばlayoutをadminに変更する
  }
}
public function beforeFilter(){
	if(isset($this->request->params['admin'])){
    	    $this->Auth->authenticate = array(
        	'Form' => array(
             	    'userModel' => 'Owner',
                    'fields' => array('username' => 'name','password'=>'password')
                )
            );
           $this->Auth->loginAction = array('controller' => 'users','action' => 'login', 'admin'=>true);
           $this->Auth->loginRedirect = array('controller' => 'users', 'action' => 'index', 'admin'=>true);
           $this->Auth->logoutRedirect = array('controller' => 'users', 'action' => 'login', 'admin'=>true);
           AuthComponent::$sessionKey = "Auth.Owner";
        }else{
           $this->layout = 'user'; //レイアウトを切り替える。
           AuthComponent::$sessionKey = "Auth.User";
	}
}


こうやってbeforeFilter()とかで判別してレイアウトを切り替えたり
Authを書き換えたりする方法を見てると、
そもそもやってた、無理矢理に継承する方法は
ゴリゴリしすぎてエレガントじゃないな、となっちゃいますね(´・ω・`)

今はまだリリースしてないので、
どこかのタイミングでprefix routingでのuserとadminのログイン機構に
リプレイスしたいと思います。

ノシノシ


こちらも参考に
プレフィックスル-ティング(Prefix Routing) | CakePHP情報

[CakePHP]adminルーティングの時だけAuth認証を行う | HappyQuality