管理画面にログインしているユーザーにのみコンテンツを表示させるように、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 %}
あとがき
サービスクラスを追加する手間はありますが、管理者用の表示テストが行えるようになりますので、ぜひ参考にしていただければ幸いです。



コメントを残す