2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

EC-CUBEAdvent Calendar 2023

Day 19

【ECEUBE4】セキュリティ管理>システム設定で使用中の管理画面URLが登録できない!

Last updated at Posted at 2023-12-18

この間、セキュリティ管理>システム設定画面で設定を更新しようとした時に困ったことを書きます。

すでに運用されているサイトだったため、管理画面URL設定はadmin以外が指定されていたのですが、他の項目を入力して更新ボタンを押したら

スクリーンショット 2023-12-18 4.14.54.png

管理画面URL設定項目でエラー:astonished:

admin_route_dirのFormTypeは以下の通り。

            ->add('admin_route_dir', TextType::class, [
                'constraints' => [
                    new Assert\NotBlank(),
                    new Assert\Length(['max' => $this->eccubeConfig['eccube_stext_len']]),
                    new Assert\Regex([
                        'pattern' => '/\A\w+\z/',
                    ]),
                    new Assert\Regex([
                        'pattern' => "/^(?!($routes)$).*$/",
                    ]),
                ],
                'data' => $this->eccubeConfig->get('eccube_admin_route'),
            ])

'pattern' => '/\A\w+\z/'のパターンで引っかかってる訳ではなさそうなので、その下のバリデーションで引っかかってるみたいです。
こちらはフロント画面と同じルートと同じ文字列を使用していないかチェックをしている箇所です。

var_dumpを使用して$routesの中身をチェック

スクリーンショット 2023-12-18 4.41.47.png

フロント画面のルートの中に管理画面URL設定で設定しているルートも含まれてます。

これでは更新する場合に同じルートでは更新ができないということになってしまいますね。

こちらを回避する方法としては、
src/Eccube/Form/Type/Admin/SecurityType.php
でフロントのルートを取得しているところでconfigのeccube_admin_routeを比較して同じだった場合は除外
という処理を入れてあげればいいかと思います。

    private function getRouteCollection(): string
    {
        $frontRoutesUrlList = [];
        $routes = $this->router->getRouteCollection();
        foreach ($routes as $routeName => $route) {
            $path = $route->getPath();
            // 管理画面以外
            if (false === stripos($routeName, 'admin')
                && false === stripos($path, '/_')
                && false === stripos($path, 'admin')
            ) {
                $arr = explode('/', $path);
                foreach ($arr as $target) {
                    if (!empty($target)) {
+                        if ($target === $this->eccubeConfig->get('eccube_admin_route')) {
+                            //管理画面URLは除外
+                            continue;
+                        }
                        //↑ここまで
                        $target = preg_quote($target);
                        $frontRoutesUrlList[$target] = $target;
                    }
                }
            }
        }

        return implode('|', $frontRoutesUrlList);
    }

もう一度更新。

スクリーンショット 2023-12-18 5.08.24.png

ちゃんと保存されましたね。

この現象が起きるのはプラグインによる影響かと思います。

@Route("/%eccube_admin_route%/route/test", name="route_test")

上記の処理が入ってるプラグインを導入している場合、フロント画面のルートを取得する時に取れてしまってるようなので、
もしかしたら本体のバグ、、の様な気もしますね。

同じ様な現象で困った方がいらっしゃいましたら参照にしてもらえると嬉しいです:smiley:

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?