Symfony

Symfony 是一組可重複使用的 PHP 元件及 PHP 框架,用於構建網頁應用程式、API、微服務和網路服務。

此指南已在版本 4.3 中進行過成功測試,但也應該適用於舊版本。

Symfony 沒有中介軟體 (middleware) 的概念,因此您可以創建一個父控制器來實作 Shieldon Firewall,就像我們 CodeIgniter 指南 中的步驟一樣。

如果您不想在父控制器中初始化 Shieldon Firewall,您可以遵循下面提供的 Bootstrap 模式步驟。

Symfony 框架中的防火牆

安裝

使用 PHP Composer:

composer require shieldon/shieldon

這也會安裝 Shieldon 所需的相依套件:

實作

Bootstrap

1. 在初始化 Kernel 之前

在您的 config/bootstrap.php 中,以下面這行之後:

require dirname(__DIR__).'/vendor/autoload.php';

加入以下程式碼:

範例:

/*
|--------------------------------------------------------------------------
| 執行 Shieldon 防火牆
|--------------------------------------------------------------------------
|
| Shieldon 防火牆將監視所有傳入您網站的 HTTP 要求。
*/
if (isset($_SERVER['REQUEST_URI'])) {

    // 這個目錄必須可寫入。
    $storage = __DIR__ . '/../storage/shieldon';

    $firewall = new \Shieldon\Firewall\Firewall();
    $firewall->configure($storage);

    // 控制台的基本 URL。
    $firewall->controlPanel('/firewall/panel/');

    $response = $firewall->run();

    if ($response->getStatusCode() !== 200) {
        $httpResolver = new \Shieldon\Firewall\HttpResolver();
        $httpResolver($response);
    }
}

2. 定義 Firewall 控制台的路由

執行以下命令來建立一個名為 FirewallPanelController 的控制器。

範例:

php bin/console make:controller FirewallPanelController

FirewallPanelController 控制器類別中加入以下程式碼:

範例:

$panel = new \Shieldon\Firewall\Panel();
$panel->entry();

如果您已啟用 CSRF,加入以下程式碼:

範例:

$csrf = $this->container->get('security.csrf.token_manager');
$token = $csrf->refreshToken('key');

完整範例如下:

範例:

<?php

namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;

class FirewallPanelController extends AbstractController
{
    /**
     * @Route("/firewall/panel/", name="firewall_panel")
     */
    public function panel()
    {
        $panel = new \Shieldon\Firewall\Panel();

        // 如果您已安裝 `symfony/security-csrf`。
        $csrf = $this->container->get('security.csrf.token_manager');
        $token = $csrf->refreshToken('key')->getValue();

        $panel->csrf(['_token' => $token]);
        $panel->entry();
        exit;
    }

    /**
     * @Route("/firewall/panel/{class}/{method}", name="firewall_panel_page")
     */
    public function page()
    {
        $this->panel();
    }
}

就是這樣。

您可以透過 /firewall/panel 存取防火牆控制台,在瀏覽器中前往此網址以查看頁面。

控制台

https://yourwebsite.com/firewall/panel

預設登入帳號為 shieldon_user,密碼為 shieldon_pass。登入防火牆控制台後,您應該立即更改登入帳號和密碼。

如果在「Daemon」設定部分啟用了 Shieldon 防火牆,它將開始監控您的網站。請確保已正確設定好這些設定。