baserCMSで会員ログイン機能を作成した際に、会員ログイン時、もとの閲覧していた公開ページへ遷移させる動作を作ってみました。
■ 課題点
・会員がログインする際に、ログインフォームからのログイン後遷移の際に、マイページ側ダッシュボードへ遷移するため、もとの閲覧していたページを再度探さなくてはならないので解消したい。
想定している対象者
- baserCMSでウェブサイトを制作をしている方
- baserCMSでマイページ機能(会員ログイン機能)を作成している方
- baserCMSのイベント処理に興味がある方
発生状況
- 会員ログイン後、通常の動作ではマイページ側のダッシュボードへ遷移する点を調整したい
- ログイン後の遷移先は、認証プレフィックス設定で設定できるが固定
環境
- baserCMS 3.0.6.1
考えてみた対処策
- ログイン用フォームへ遷移する前のリファラーを保持する
- ログイン時に、ログイン用フォームへの遷移前のURLへ遷移させる
- ログイン用フォームへの遷移前のURLは、サイト内のリンクであることをチェックする
イベント処理の作成
利用するイベントを設定します。
startup, beforeRender の2つを利用します。
ControllerEventListener.php
<?php
/**
* [ControllerEventListener]
*
*/
class YourPluginControllerEventListener extends BcControllerEventListener
{
/**
* 登録イベント
*
*/
public $events = array(
'startup',
'beforeRender',
);
/**
* startup
*
* @param CakeEvent $event
*/
public function startup(CakeEvent $event)
{
$Controller = $event->subject();
$this->changeloginRedirect($Controller);
}
/**
* beforeRender
*
* @param CakeEvent $event
*/
public function beforeRender(CakeEvent $event)
{
$Controller = $event->subject();
if (BcUtil::isAdminSystem()) {
return;
}
$this->holdRefererUrl($Controller);
}
/**
* ログイン画面に遷移する際に、遷移前のURLをセッションに保持する
*
* @param Object $Controller
*/
private function holdRefererUrl($Controller)
{
$targetController = array('members');
if (!in_array($Controller->request->params['controller'], $targetController)) {
return;
}
$targetAction = array('admin_login');
if (!in_array($Controller->request->params['action'], $targetAction)) {
return;
}
$referer = $Controller->referer();
$Controller->Session->write('MyMember.referer', $referer);
}
/**
* 会員ログインの際、ログイン画面に遷移する前のページをログイン後の遷移画面に設定する
*
* @param Object $Controller
*/
private function changeloginRedirect($Controller)
{
$targetController = array('members');
if (!in_array($Controller->request->params['controller'], $targetController)) {
return;
}
$targetAction = array('member_login');
if (!in_array($Controller->request->params['action'], $targetAction)) {
return;
}
if ($Controller->Session->check('MyMember.referer')) {
$refererUrl = $Controller->Session->read('MyMember.referer');
if ($this->isAccessFromThisSite($refererUrl)) {
$Controller->BcAuth->loginRedirect = $refererUrl;
}
}
}
/**
* アクセス元がサイト内からのURLかを判定する
*
* @return boolean
*/
private function isAccessFromThisSite($refererUrl)
{
$parseUrl = parse_url($refererUrl);
if (!isset($parseUrl['path'])) {
return false;
}
$parsedUrl = Router::parse($parseUrl['path']);
if (!isset($parsedUrl['controller']) || !isset($parsedUrl['action'])) {
return false;
}
// ログイン画面の場合はリダイレクトループになるため防止する
if ($parsedUrl['action'] == 'member_login') {
return false;
}
return true;
}
}
留意点
ログイン画面に遷移する際に、遷移前のURLをセッションに保持するタイミング、
アクセス元がサイト内からのURLかを判定するタイミング、
はそれぞれRequest情報、URL解析した情報をもとにして判定しているので、より厳密にしたり、特定のURLでは利用しないなどの調整ができます。