Help us understand the problem. What is going on with this article?

[baserCMS] 会員ログイン時、もとの閲覧していたページへログイン後に遷移させる

More than 5 years have passed since last update.

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では利用しないなどの調整ができます。

参考記事

materializing
Cakeをもぐもぐ。。。 https://github.com/materializing
http://www.materializing.net/
e-catchup
国産オープンソース baserCMS を世に送り出したWeb技術のプロフェッショナル集団です。
https://catchup.co.jp
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away