دليل 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
أيضاً في المكتبة
توصيات