セッションをログアウト時に破棄しないようにする

EC-CUBE3では、会員がログアウトした際にセッションを破棄します。これを破棄しないようにカスタマイズします。

EC-CUBE3のセッションに保存されている情報

カートに追加した商品を保存しています。

はじめに

こちらに記載した方針に則ってカスタマイズを行う為、カスタマイズ用のプラグインが準備済みである必要があります。

Applicationクラス

完全修飾名はEccube\Applicationです。

このクラスのinitSecurity()メソッドで、管理者と会員に関するログイン、ログアウトに関して設定を行っています。

このうち、会員のログアウトに関する設定に”invalidate_session”キーでfalseを設定すると、セッションが破棄されなくなります。

しかし、このクラスは、EC-CUBE3本体のソースコードなので、変更してはいけません。理由はこちら

$this['security.firewalls'] = array(
    'admin' => array(
'pattern' => "^/{$this['config']['admin_route']}",
'form' => array(
    'login_path' => "/{$this['config']['admin_route']}/login",
    'check_path' => "/{$this['config']['admin_route']}/login_check",
    'username_parameter' => 'login_id',
    'password_parameter' => 'password',
    'with_csrf' => true,
    'use_forward' => true,
),
'logout' => array(
    'logout_path' => "/{$this['config']['admin_route']}/logout",
    'target_url' => "/{$this['config']['admin_route']}/",
),
'users' => $this['orm.em']->getRepository('Eccube\Entity\Member'),
'anonymous' => true,
    ),
    'customer' => array(
'pattern' => '^/',
'form' => array(
    'login_path' => '/mypage/login',
    'check_path' => '/login_check',
    'username_parameter' => 'login_email',
    'password_parameter' => 'login_pass',
    'with_csrf' => true,
    'use_forward' => true,
),
'logout' => array(
    'logout_path' => '/logout',
    'target_url' => '/',
    'invalidate_session' => false // <-- ここに追加。だけど、追加してはいけません。
),
'remember_me' => array(
    'key' => sha1($this['config']['auth_magic']),
    'name' => 'eccube_rememberme',
    // lifetimeはデフォルトの1年間にする
    // 'lifetime' => $this['config']['cookie_lifetime'],
    'path' => $this['config']['root_urlpath'] ?: '/',
    'secure' => $this['config']['force_ssl'],
    'httponly' => true,
    'always_remember_me' => false,
    'remember_me_parameter' => 'login_memory',
),
'users' => $this['orm.em']->getRepository('Eccube\Entity\Customer'),
'anonymous' => true,
    ),
);

ServiceProviderクラス

完全修飾名はPlugin\<your plugin name>\ServiceProvider\ServiceProviderです。このクラスの名前はプラグインを作成する際に、好きに付けられるので、この名前ではない場合があります。

このクラスで、上記設定項目の追加を行いましょう。

register($app)メソッドで行います。

public function register(Application $app)
{
    // セッションをログアウト後も保持するよう設定
    $logout = $app['security.firewalls']['customer']['logout'];
    $logout['invalidate_session'] = false;
    $customer = $app['security.firewalls']['customer'];
    $customer['logout'] = $logout;
    $securityFirewalls = $app['security.firewalls'];
    $securityFirewalls['customer'] = $customer;
    $app['security.firewalls'] = $securityFirewalls;
}

この手法で、EC-CUBE3本体のソースコードを汚染することなく、ログアウト時にセッション情報を破棄しないようにカスタマイズできます。

最後に

Eccube\Applicationクラスに修正しなければならない場合、今回のようにカスタマイズプラグインのServiceProviderで設定値や機能の挿げ替えが行える場合があります。今回の手法を参考にして下さい。