دليل Symfony/Security الشامل لـ PHP: أمثلة وتطبيقات

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

دليل Symfony/Security الشامل لـ PHP مع أمثلة عملية

مكتبة Symfony/Security هي مكون قوي ومرن من نظام Symfony البيئي، مصممة لتنفيذ التحقق من الهوية (Authentication) والتحقق من الصلاحيات (Authorization) في تطبيقات PHP. توفر للمطورين بنية جاهزة لحماية المسارات، وإدارة الجلسات، والتعامل مع كلمات المرور، والتكامل مع مزودي المستخدمين المختلفين (قواعد البيانات، LDAP، OAuth).

لماذا تحتاج هذه المكتبة؟ في تطوير الويب الحديث، الأمان ليس خيارًا بل متطلبًا أساسيًا. تتيح لك Symfony/Security التحرر من المهام الروتينية: تشفير كلمات المرور، إنشاء نماذج تسجيل الدخول، التحقق من الأدوار والرموز. بدلاً من إعادة اختراع العجلة، تحصل على معيار صناعي يُستخدم في آلاف المشاريع حول العالم. يمكن دمج هذا المكون بسهولة مع إطار Symfony أو مع تطبيقات PHP الأخرى عبر حزمة symfony/security-core.

أبرز الإمكانيات تشمل: دعم جدران حماية متعددة (firewalls) لأجزاء مختلفة من التطبيق، نظام مرن لمزودي المستخدمين، إدارة تلقائية للجلسات وملفات تعريف الارتباط، وحماية مدمجة ضد هجمات CSRF وتخمين كلمات المرور. تتبع المكتبة مبدأ "الأمان افتراضيًا"، مما يجعلها الخيار الأمثل للمشاريع مهما كان حجمها.

طريقة التثبيت

يتم التثبيت عبر Composer - مدير الحزم القياسي لـ PHP. نفّذ الأمر التالي في المجلد الرئيسي لمشروعك:

composer require symfony/security-bundle

إذا كنت تستخدم Symfony Flex (موصى به)، فسيقوم الوصفة تلقائيًا بإعداد التكوين الأساسي. للمشاريع المستقلة (بدون إطار عمل)، قم بتثبيت النواة:

composer require symfony/security-core symfony/security-http symfony/security-csrf

بداية سريعة: مثال عملي مصغر

لننشئ صفحة محمية بسيطة. تأكد أولاً من تثبيت Symfony (الإصدار 6.4+). سننشئ وحدة تحكم (Controller) ونضبط إعدادات الأمان.

الخطوة 1: إعداد ملف security.yaml

# config/packages/security.yaml
security:
    enable_authenticator_manager: true
    providers:
        in_memory:
            memory:
                users:
                    admin:
                        password: '$2y$13$...' # تجزئة كلمة المرور "admin123"
                        roles: ['ROLE_ADMIN']
    firewalls:
        main:
            lazy: true
            provider: in_memory
            form_login:
                login_path: login
                check_path: login
            logout:
                path: /logout
    access_control:
        - { path: ^/admin, roles: ROLE_ADMIN }

الخطوة 2: إنشاء وحدة التحكم (Controller)

// src/Controller/SecurityController.php
namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;

class SecurityController extends AbstractController
{
    #[Route('/login', name: 'login')]
    public function login(AuthenticationUtils $authenticationUtils): Response
    {
        $error = $authenticationUtils->getLastAuthenticationError();
        $lastUsername = $authenticationUtils->getLastUsername();

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

    #[Route('/admin', name: 'admin')]
    public function admin(): Response
    {
        $this->denyAccessUnlessGranted('ROLE_ADMIN');
        return new Response('مرحبًا بك في لوحة التحكم!');
    }
}

الخطوة 3: قالب تسجيل الدخول (Twig)

{# templates/security/login.html.twig #}
{% if error %}
    
{{ error.mes

توصيات