ホームページ >バックエンド開発 >PHPチュートリアル >Symfony Security Bundle を使用した PHP セキュリティ検証

Symfony Security Bundle を使用した PHP セキュリティ検証

WBOY
WBOYオリジナル
2023-07-24 14:25:131554ブラウズ

Symfony Security Bundle による PHP セキュリティ検証

Symfony は、Web アプリケーション開発プロセスを簡素化する豊富で強力な機能を提供する人気の PHP 開発フレームワークです。重要な機能の 1 つはセキュリティ検証であり、Symfony はセキュリティ バンドルを統合することで認証と認可を実装します。この記事では、Symfony Security Bundle を使用して PHP アプリケーションを保護する方法について説明します。

1. Symfony セキュリティ バンドルのインストール

まず、Symfony フレームワークがインストールされていることを確認してください。次に、Composer を通じて Symfony Security Bundle をインストールできます。コマンド ラインで次のコマンドを実行します:

composer require symfony/security-bundle

インストールが完了したら、config/bundles.php ファイルにバンドルを登録する必要があります:

<?php

return [
    // ...
    SymfonyBundleSecurityBundleSecurityBundle::class => ['all' => true],
];

上記の手順を完了すると、Symfony Security Bundle が正常にインストールされました。

2. セキュリティ検証の設定

Symfony では、セキュリティ検証の設定は主に security.yaml ファイルで完了します。プロジェクトの config フォルダーに security.yaml という名前のファイルを作成し、次の基本構成を実行します。

security:
  encoders:
    AppEntityUser:
      algorithm: bcrypt
  providers:
    app_user_provider:
      entity:
        class: AppEntityUser
        property: username
  firewalls:
    main:
      anonymous: ~
      form_login:
        login_path: login
        check_path: login
      logout:
        path: /logout
      remember_me:
        secret: '%env(APP_SECRET)%'
  access_control:
    - { path: ^/admin, roles: ROLE_ADMIN }
    - { path: ^/profile, roles: ROLE_USER }

上の例では、パスワード暗号化を構成します。アルゴリズムは bcrypt、app_user_provider という名前のユーザー プロバイダーが提供され、ログイン パスとログアウト パスが定義され、レコードを保護するために環境変数 APP_SECRET が設定されています。関数を実行してください。

3. ユーザー エンティティの作成

前の手順の設定でユーザー プロバイダーを定義したので、次にユーザー エンティティ クラスを作成する必要があります。 User.php という名前のファイルを作成し、次のコードを記述します。

<?php

namespace AppEntity;

use SymfonyComponentSecurityCoreUserUserInterface;

class User implements UserInterface
{
    private $id;
    private $username;
    private $password;
    private $roles = [];

    // 省略构造函数和getter/setter方法

    public function getRoles(): array
    {
        return $this->roles;
    }

    public function getPassword(): string
    {
        return $this->password;
    }

    public function getSalt()
    {
        // 不使用Salt
    }

    public function getUsername(): string
    {
        return $this->username;
    }

    public function eraseCredentials()
    {
        // 没有需要擦除的凭据
    }
}

上記の例では、UserInterface インターフェイスを実装し、必要なメソッドを提供しました。

4. ログイン コントローラーの作成

次に、ユーザーのログイン リクエストを処理するログイン コントローラーを作成する必要があります。 SecurityController.php というファイルを作成し、次のコードを記述します。

<?php

namespace AppController;

use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentRoutingAnnotationRoute;
use SymfonyComponentSecurityHttpAuthenticationAuthenticationUtils;

class SecurityController extends AbstractController
{
    /**
     * @Route("/login", name="login")
     */
    public function login(AuthenticationUtils $authenticationUtils)
    {
        $error = $authenticationUtils->getLastAuthenticationError();

        return $this->render('security/login.html.twig', [
            'error' => $error
        ]);
    }

    /**
     * @Route("/logout", name="logout")
     */
    public function logout()
    {
        // 该方法留空,Symfony会自动处理注销过程
    }
}

上記の例では、AuthenticationUtils サービスを使用して、最後の ID エラー メッセージを取得します。検証の失敗を検出し、表示のためにログイン テンプレートに渡します。

5. ログイン テンプレートの作成

最後に、ログイン ページを表示するためのログイン テンプレートを作成する必要があります。アプリケーションの templates/security フォルダーに login.html.twig というファイルを作成し、次のコードを記述します。

{% extends 'base.html.twig' %}

{% block body %}
<h2>Login</h2>

{% if error %}
    <div class="alert alert-danger">{{ error.messageKey|trans(error.messageData, 'security') }}</div>
{% endif %}

<form action="{{ path('login') }}" method="post">
    <input type="hidden" name="_csrf_token" value="{{ csrf_token('authenticate') }}">

    <div class="form-group">
        <label for="username">Username</label>
        <input type="text" id="username" name="_username" value="{{ last_username }}" required autofocus>
    </div>

    <div class="form-group">
        <label for="password">Password</label>
        <input type="password" id="password" name="_password" required>
    </div>

    <button type="submit">Login</button>
</form>
{% endblock %}

上記の例では、次のコードを使用します。 Twig テンプレート エンジンを使用してログイン フォームをレンダリングし、csrf_token メソッドを通じて非表示の CSRF トークンを生成します。

6. 制限付きページの保護

上記の access_control 設定で設定したルールに従って、ROLE_ADMIN ロールを使用してページを保護できます。 /admin パスの下のページの場合は、ROLE_USER ロールを使用して、/profile パスの下のページを保護します。対応するロールを持つユーザーは、アクセスするコントローラーの対応するパスに追加する必要があります。

7. 概要

Symfony Security Bundle を通じて、PHP アプリケーションのセキュリティ検証を簡単に実装できます。この記事で説明されている手順は、より安全なアプリケーションの構築を開始するのに役立ちます。もちろん、Symfony Security Bundle は、LDAP による認証、ファイアウォールの構成など、より高度な機能も提供します。この記事があなたの学習に役立つことを願っています。

以上がSymfony Security Bundle を使用した PHP セキュリティ検証の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。