今回は会員専用サイトに挑戦してみたいと思います。
基本的には、前回前々回に行った内容を見方を変えてみるような形ですね。
それではやってみましょう。
まず、簡単な話からですね。
EC-CUBE3 では Symfony2 をベースとした Silex を使用しています。
その為、基本的な会員のログイン状況は Symfony2 の以下の方法で判断することが出来ます。
if ($app->isGranted('ROLE_USER')) { // 会員としてログインしている場合の処理 }
部分部分に関しては上記の内容にて会員のみの表示を行う事は可能になります。
但し、会員サイトとしては一部対応では困ります。
やっぱりテンプレートファイル毎に変更を行うのでは無く根本的に変更出来ればと思います。
実際に変更を行うファイルはおなじみの以下のファイルです。
<インストールフォルダ>/src/Eccube/Application.php
上記のファイルの中の initSecurity と云う関数の中の変数を変更してます。
570行目辺りに該当の変数ですね。
$this['security.access_rules'] = array( array("^/{$this['config']['admin_route']}/login", 'IS_AUTHENTICATED_ANONYMOUSLY', $channel), array("^/{$this['config']['admin_route']}/", 'ROLE_ADMIN', $channel), array('^/mypage/login', 'IS_AUTHENTICATED_ANONYMOUSLY', $channel), array('^/mypage/withdraw_complete', 'IS_AUTHENTICATED_ANONYMOUSLY', $channel), array('^/mypage/change', 'IS_AUTHENTICATED_FULLY', $channel), array('^/mypage', 'ROLE_USER', $channel), );
今回は変数に対して以下のような内容を追加していく形です。
$this['security.access_rules'] = array( array("^/{$this['config']['admin_route']}/login", 'IS_AUTHENTICATED_ANONYMOUSLY', $channel), array("^/{$this['config']['admin_route']}/", 'ROLE_ADMIN', $channel), array('^/mypage/login', 'IS_AUTHENTICATED_ANONYMOUSLY', $channel), array('^/mypage/withdraw_complete', 'IS_AUTHENTICATED_ANONYMOUSLY', $channel), array('^/mypage/change', 'IS_AUTHENTICATED_FULLY', $channel), array('^/mypage', 'ROLE_USER', $channel), // 会員専用サイト array('^/', 'ROLE_USER'), );
実際に追加した内容は以下の通りです。
// 会員専用サイト array('^/', 'ROLE_USER'),
最初の「’^/’」はインストールしたルートページ以下全てを意味します。
次の「’ROLE_USER’」は「会員ログインしている」状態の場合のみ表示する形となります。
これですべてのページに対して会員ログインしていないと表示できない状況とすることが出来ました。
実際にはリダイレクトするのでは無く対象ページを表示してもログインページが表示される形です。
まぁ、このままではどのページもログインしないと表示されません。
「トップページ」だけは表示してもいい、と云った場合や「新規会員登録」などは別に設定する必要があります。
たとえば、以下のページは表示できるようにすべきでは無いでしょうか。
・「’^/$’」トップページ
・「’^/entry’」新規会員登録
・「’^/help’」各種ヘルプページ「当サイトについて プライバシーポリシー 特定商取引法に基づく表記」
・「’^/contact’」お問い合わせ
・「’^/products/list’」商品一覧ページ
$this['security.access_rules'] = array( array("^/{$this['config']['admin_route']}/login", 'IS_AUTHENTICATED_ANONYMOUSLY', $channel), array("^/{$this['config']['admin_route']}/", 'ROLE_ADMIN', $channel), array('^/mypage/login', 'IS_AUTHENTICATED_ANONYMOUSLY', $channel), array('^/mypage/withdraw_complete', 'IS_AUTHENTICATED_ANONYMOUSLY', $channel), array('^/mypage/change', 'IS_AUTHENTICATED_FULLY', $channel), array('^/mypage', 'ROLE_USER', $channel), // 会員専用サイト array('^/$', 'IS_AUTHENTICATED_ANONYMOUSLY'), array('^/entry', 'IS_AUTHENTICATED_ANONYMOUSLY'), array('^/help', 'IS_AUTHENTICATED_ANONYMOUSLY'), array('^/contact', 'IS_AUTHENTICATED_ANONYMOUSLY'), array('^/products/list', 'IS_AUTHENTICATED_ANONYMOUSLY'), array('^/', 'ROLE_USER'), );
商品一覧ページやトップページも非表示にする場合は以下の該当部分をコメントアウトする必要があります。
また、すべてのページは表示するがカートのみ非表示は最初に述べた簡易的な対応をした方が望ましいですね。
なお、記載内容としては「array(‘^/’, ‘ROLE_USER’),」を追加した内容の後に書いてください。
上部に記載された順に評価するため、先に「array(‘^/’, ‘ROLE_USER’),」を記載してしまうと他の内容が反映されません(笑)
なお、会員ログインが必要な項目として「ROLE_USER」を紹介しました。
実はログインを強制する方法として「IS_AUTHENTICATED_FULLY」も存在します。
似たような内容ではありますが明確な違いがあります。
違いは「自動ログイン済の場合」です。
「IS_AUTHENTICATED_FULLY」に関しては自動ログインしていても改めてログインさせます。
余り使う場面はありませんが、編集前の内容の以下の部分が良い例になります。
「array(‘^/mypage/change’, ‘IS_AUTHENTICATED_FULLY’, $channel),」
会員ページの内容編集ページに関しては自動ログインだけではなく、正式にログインしないと良くないですね。
そう云ったページの場合には「’IS_AUTHENTICATED_FULLY’」を使うようにしてください。
と云うことで、今回は終了とさせて頂きます。