管理画面にログインしているユーザーにのみコンテンツを表示させるように、Twig上で条件分岐できるようにする方法をご紹介いたします。

公開前の情報をページに追加して表示確認を行いたい場合、ステージング環境があればそこでやれば良いですが、後述する方法で条件分岐させれば簡単に表示/非表示の制御ができるようになります。

EC-CUBE4で管理画面にログインしているかを判別する条件分岐を実装する手順

※EC-CUBE4.3で検証しています。

まずは、/app/Customize/Service/AdminAuthChecker.phpを作成します。

<?php

namespace Customize\Service;

use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;

class AdminAuthChecker {
  private $requestStack;

  public function __construct(RequestStack $requestStack) {
    $this->requestStack = $requestStack;
  }

  public function isAdminLoggedIn(): bool {
    $session = $this->requestStack->getSession();
    if (!$session) {
      return false;
    }

    $serializedToken = $session->get('_security_admin'); // security.yamlと合わせる

    if (!$serializedToken) {
      return false;
    }

    $token = unserialize($serializedToken);

    return $token && $token->getUser() && in_array('ROLE_ADMIN', $token->getRoleNames());
  }
}

/app/config/eccube/packages/security.yamlの中に、”firewalls”という設定の記述があります。”admin”のところと”_security_〇〇”の〇〇の部分を合わせます。
(デフォルトはadminです)

firewalls:
  dev:
    pattern: ^/(_(profiler|wdt)|css|images|js)/
    security: false
  admin:
    pattern: '^/%eccube_admin_route%/'
    provider: member_provider
    form_login:
      enable_csrf: true
      check_path: admin_login
      login_path: admin_login
      default_target_path: admin_homepage
      username_parameter: 'login_id'
      password_parameter: 'password'
      use_forward: false
      success_handler: eccube.security.success_handler
      failure_handler: eccube.security.failure_handler
    login_throttling:
      max_attempts: '%eccube_login_throttling_max_attempts%'
      interval: '%eccube_login_throttling_interval%'
    logout:
      path: admin_logout
      target: admin_login

続いて、/app/Customize/Twig/Extension/AdminAuthExtension.phpを作成します。

<?php

namespace Customize\Twig\Extension;

use Customize\Service\AdminAuthChecker;
use Twig\Extension\AbstractExtension;
use Twig\TwigFunction;

class AdminAuthExtension extends AbstractExtension {
  private $adminAuthChecker;

  public function __construct(AdminAuthChecker $adminAuthChecker) {
    $this->adminAuthChecker = $adminAuthChecker;
  }

  public function getFunctions() {
    return [
      new TwigFunction('is_admin_logged_in', [$this->adminAuthChecker, 'isAdminLoggedIn']),
    ];
  }
}

これで準備完了です。

管理画面にログインしているユーザーにだけ見せたい内容を、Twig内に記述します。その際、以下のようにis_admin_logged_in()で条件分岐します。

{% if is_admin_logged_in() %}
  <div class="ec-admin-only">
    ※これは管理者用のプレビュー表示です
  </div>
{% endif %}

あとがき

サービスクラスを追加する手間はありますが、管理者用の表示テストが行えるようになりますので、ぜひ参考にしていただければ幸いです。

投稿者

himecasのアバター

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です