Authentication و Authorization في Symfony
Symfony > كيف تعمل Authentication و Authorization في Symfony
كتبه: محمد الشناق. 30 مايو 2024
في هذا البحث الموجه لمطوري تطبيقات الانترنت بلغة PHP وتحديدا المطورين الذين يستخدمون إطار العمل Symfony سوف اضع قائمة بالمراجع والمصادر والمحتوى الذي يساعد المطور على فهم نظام Authentication و Authorization للمستخدمين في التطبيق من اجل اتاحة عمليات تسجيل الدخول للمستخدمين والمشرفين والتحقق من صلاحياتهم.
عند تنفيذ اي نظام - سواء باستخدام Symfony او اي اطار عمل او لغة برمجة اخرى - فانه في معظم الاحيان تحتاج لحمايه هذا النظام بنظام عضويات يتضمن التاكد من هويات المستخدمين عن طريق Authentication (التوثيق) وذلك بتسجيل الدخول (Login) الى النظام ثم التاكد ايضا من صلاحيات المستخدمين للوصول الى موارد ذلك النظام من خلال Authorization (التخويل)
قد تتضمن عملية التوثيق تسجيل الدخول عن طريق اسم مستخدم username وكلمة مرور Password او قد تتضمن البريد الالكتروني وكلمة مرور او رقم هاتف وكلمة مرور ... الخ وبحسب كل نوع من انواع التوثيق قد يكون هناك بعض الاجراءات الخاصه المطلوبة ، كان يتم ارسال OTP الى رقم الهاتف بدلا من استخدام كلمة مرور مخزنه مسبقا او استخدام كلاهما معا بان يتم تسجيل الدخول بواسطه رقم هاتف وكلمة مرور ثم OTP من خلال SMS للتحقق من المستخدم بطبقة حماية اضافيه. والامثله الاخرى كثيره على عمليات التوثيق مثلا تسجيل الدخول بواسطه اسم مستخدم وكلمة مرور ثم طلب OTP من هلال Time-Based app (مثل Google Authenticator) من اجل التاكد من هوية المستخدم في حال كان مسجل الدخول من عنوان اي بي جديد او متصفح جديد لم يسبق للمستخدم تسجيل الدخول من خلاله في الماضي او استخدام اسم المستخدم وكلمة المرور فقط في حال كان عنوان الاي بي معروفا او ان المتصفح الخاص بالمستخدم يحتوي علي cookies تدل انه سبق واستخدم النظام .... الخ من السيناروهات الاخرى. اضف الى ذلك الامور اللوجستية الاخرى كالاحتفاظ بسجلات وصول "Logs" تحتوي على عمليات تسجيل الدخول الناجحه والفاشله من اجل تتبعها او اجراء بعض الامور الثانويه بناء عليها ... الخ من الامور التي سوف اتطرق لها في هذا البحث.
اثناء فحص التخويل (Authorization) فاننا نود لفئة معينه مثلا "المشرفين" بالوصول الى اجزاء معينه من النظام لادارة النظام ، بيما نود للمستخدمين الوصول الى اجزاء اخرى فقط ، مع توفير الامكانية للمشرفين العامين للوصول الى جميع موادر النظام. وبغض النظر عن سواء كنا سوف نستخدم مبدا الادوار roles ان صلاحيات المستخدمين User permissions او صلاحيات مجموعات المستخدمين Users Groups Permissions فان النظام يجب ان يقكون قادرا على ادارة تلك الصلاحيات لتحديد صلاحيات كل مستخدم.
> في البداية انصحك بالاصلاع على ما هو الفرق بين Authentication و Authorization للمستخدمين في حال لم تكن تعرف الفروقات بينهما.
تقديم
في Symfony يمكننا استخدام Security Bundle Component[١] والتي توفر لنا الادوات اللازمه من اجل التوثيق (Authentication) والتخويل (Authorization) وهي ما سوف استخدمها في هذا البحث. ايضا خلال هذا البحث سوف اقوم على دراسة معظم اساليب Authentication و Authorization التي يمكن تطبيقها من خلال Symfony.
من اجل تطبيق ما ورد في هذا البحث فاننا سوف نحتاج انشاء مشروع Symfony جديد وقد نحتاج لانشاء اكثر من مشروع Symfony اثناء التطبيق العمل في كل مرة. يمكنك مراجعة البدء بمشروع Symfony جديد لمعرفة كيفية بدء مشروع Symfony جديد في حال لم تكن تعرف ذلك. وبكل تاكيد تحتاج لمعرفة في لغة PHP ومعرفة اساسيات اطر العمل التعمل تعمل بمبدا MVC. حيث انه في اثناء هذا البحث لن اتحدث عن كيفية كتابة الكود بقدر ما سوف اتحدث عن كيفية توظيف التقنيات وتكاملها وربطها لتحقيق المطلوب. بالاضافه الى انه بكل تاكيد تحتاج لتوفير بيئة تطوير تتناسب ومتطلبات تشغيل Symfony سواء على نظام تشغيل macOS او Linux او Windows. راجع المتطلبات الفنية لتشغيل Symfony[٢] لمعرفة ماذا سوف تحتاج لتشغيل Symfony على جهازك.
ارجو الانتباه انه وخلال هذا البحث لن اولي واجهة المستخدم UI ايه اهميه وسوف استخدم اكواد HTML بسيطه اثناء العمل، انت يمكنك فيما بعد التوسع في ال UI واستخدام الواجهات التي تناسبك.
من اجل توفير الكود الذي سوف اقوم على كتابته في هذا البحث على الانترنت وارشفته وجعلة متاحا للجميع فانني قمت على انشاء مستودع على GitHub يمكنك الوصول اليه والاطلاع على الاكواد على الرابط https://github.com/mshannaq/symfony-access-control-research ، ارجو العلم ان المشروع الموجود في مستودع Github هو للاغراض التعليمية فقط.
البدء باستخدام Symfony Security Bundle
في البداية نقوم على انشاء مشروع Symfony جديد ونقوم بانشاء قاعدة بيانات جديده وربطها في النظام من خلال تحرير الملف .env والتاكد من ادخال معلومات القاعده الصحيحه ثم التاكد من اتصال النظام بقاعده البيانات من خلال الامر
php bin/console doctrine:migrations:status
ويجب ان نتاكد من اننا نستخدم Symfony Security Bundle وذللك من خلال تنفيد الامر (قد تكون Symfony Security Bundle مضمنه بالاصل الى ملفات المشروع يمكنك التاكد من ذلك بفحص محتوي الملف composer.json)
composer require symfony/security-bundle
يقوم هذا الامر بالتاكد من تضمين security-bundle الى ملفات المشروع والتاكد من اضافه البيانات الافتراضية للملف config/packages/security.yaml
[٣]
الجدار الناري في سمفوني Firewall
قسم الجدران النارية (Firewalls[٤]) في ملف config/packages/security.yaml
ضمن ملفات اعدادات المشروع هو القسم الأهم لان الجدار الناري هو نظام التوثيق الخاص بك. الجدار الناري Firewall يحدد أي أجزاء من تطبيقك محمية وكيف سيتمكن المستخدمون من التوثيق (مثل نموذج تسجيل الدخول، او عن طريق API token، إلخ).
التاليه هو محتوى الملف الافتراضي عند تضمن security-bundle سوف نقوم لاحقا بتعديل هذا الملف كما يتناسب مع احتياجتنا
# config/packages/security.yaml
security:
# https://symfony.com/doc/current/security.html#registering-the-user-hashing-passwords
password_hashers:
Symfony\Component\Security\Core\User\PasswordAuthenticatedUserInterface: 'auto'
# https://symfony.com/doc/current/security.html#loading-the-user-the-user-provider
providers:
users_in_memory: { memory: null }
firewalls:
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
main:
lazy: true
provider: users_in_memory
# activate different ways to authenticate
# https://symfony.com/doc/current/security.html#the-firewall
# https://symfony.com/doc/current/security/impersonating_user.html
# switch_user: true
# Easy way to control access for large sections of your site
# Note: Only the *first* access control that matches will be used
access_control:
# - { path: ^/admin, roles: ROLE_ADMIN }
# - { path: ^/profile, roles: ROLE_USER }
when@test:
security:
password_hashers:
# By default, password hashers are resource intensive and take time. This is
# important to generate secure password hashes. In tests however, secure hashes
# are not important, waste resources and increase test times. The following
# reduces the work factor to the lowest possible values.
Symfony\Component\Security\Core\User\PasswordAuthenticatedUserInterface:
algorithm: auto
cost: 4 # Lowest possible value for bcrypt
time_cost: 3 # Lowest possible value for argon
memory_cost: 10 # Lowest possible value for argon
استخدام نظام دخول باسم مستخدم وكلمة مرور
كابسط نظام على تسجيل الدخول الى النظام من اجل تطبيق مبدا التوثيق هو استخدام "اسم المستخدم" و "كلمة المرور" وهذا ما سوف اقوم به في هذا القسم. بعد ان قمنا على انشاء مشروع Symfony جديد وربط قاعدة البيانات وتضمين security-bundle الى ملفات المشروع ولتطبيق مبدا الدخول من خلال "اسم المستخدم" و "كلمة المرور" سوف اقوم بما يلي:
- انشاء كلاس Security جديد باسم Admin.
- انشاء ملف Migration جديد وتحديث قاعدة البيانات.
- انشاء امر CLI من اجل انشاء Admin جديد.
- انشاء Controller مسؤول عن عملية تسجيل الدخول ل Admin
- انشاء منطقه (مورد جديد Route) في النظام وحمايته بالـ Firewall الذي يتطلب تسجيل دخول Admin.
> للعمل على هذا الامر config/packages/security.yaml
سوف اقوم بعمل branch جديد باسم username-and-password-normal-login [٥] في مستودع GitHub حتى يسهل عليك الوصول اليه وتتبع التعديلات ايضا. حيث انه يحتوي على ملفات المشروع بعد تطبيق هذه الميزه التي سوف اقوم بها في هذا القسم.
اولا: انشاء كلاس Security جديد باسم Admin
سوف اقوم باستخدام الامر bin/console make:user
من اجل انشاء كلاس Security جديد باسم Admin حيث ان هذا الامر يقوم على Create a new security user class من خلال سطر الاوامر نقوم بتنفيذ الامر التالي:
php bin/console make:user
عند ادخال هذا الامر فانه Security Bundle سوف تعرض مجموعه من الاسئلة من اجل انشاء هذه الكلاس بحسب المطلوب والتالية هي الاسئلة التي سوف يتم طلبها والاجابات التي قمت باجابتها:
The name of the security user class (e.g. User) [User]:
> Admin
Do you want to store user data in the database (via Doctrine)? (yes/no) [yes]:
> yes
Enter a property name that will be the unique "display" name for the user (e.g. email, username, uuid) [email]:
> username
Will this app need to hash/check user passwords? Choose No if passwords are not needed or will be checked/hashed by some other system (e.g. a single sign-on server).
Does this app need to hash/check user passwords? (yes/no) [yes]:
> yes
created: src/Entity/Admin.php
created: src/Repository/AdminRepository.php
updated: src/Entity/Admin.php
updated: config/packages/security.yaml
Success!
Next Steps:
- Review your new App\Entity\Admin class.
- Use make:entity to add more fields to your Admin entity and then run make:migration.
- Create a way to authenticate! See https://symfony.com/doc/current/security.html
والتالية هو توضيح لكل سؤال:
- The name of the security user class هو اسم الكلاس التي سوف يتم انشاءها ، انا اخترت Admin لان هذه الكلاس سوف تكون مسؤلة عن ادارة المشرفين في النظام.
- Do you want to store user data in the database (via Doctrine) اختيار ما اذا كنت تود ان يتم الاحتفاظ في البيانات في قاعده البيانات او لا من خلال Doctrine ، انا اخترت yes.
- Enter a property name that will be the unique "display" name for the user اختيار ما هو الطريقه المفضله للدخول من بين القيم المعروضه، انا اخترت username لانني اود ان يكون الدخول من خلال اسم المستخدم.
- Will this app need to hash/check user passwords اختيار هل سوف يتم تشفير كلمة المرو، انا اخترت yes.
وسوف تلاحظ ان النتيجه كانت Success والتي تعني نجاح انشاء الكلاس وان الامر قام على انشاء ملفين وهما ملف Entity خاص بجدول Admin في قاعده البيانات وملف Repository من اجل انشاء اوامر ودوال التعامل مع جدول قواعد البيانات، كما ان النظام قام على التعديل على ملف config/packages/security.yaml
وهذه التعديلات هي
diff --git a/config/packages/security.yaml b/config/packages/security.yaml
index 367af25..235ff41 100644
--- a/config/packages/security.yaml
+++ b/config/packages/security.yaml
@@ -4,14 +4,18 @@ security:
Symfony\Component\Security\Core\User\PasswordAuthenticatedUserInterface: 'auto'
# https://symfony.com/doc/current/security.html#loading-the-user-the-user-provider
providers:
- users_in_memory: { memory: null }
+ # used to reload user from session & other features (e.g. switch_user)
+ app_user_provider:
+ entity:
+ class: App\Entity\Admin
+ property: username
firewalls:
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
main:
lazy: true
- provider: users_in_memory
+ provider: app_user_provider
# activate different ways to authenticate
# https://symfony.com/doc/current/security.html#the-firewall
كما تلاحظ في التعديلات التي تمت على config/packages/security.yaml
فان تم تعديل User provider ضمن providers والذي فيه تم تحديد ال Entity المسؤول عن الاحتفاظ ببيانات المستخدمين. وايضا قام على اضافه هدا ال provider في main firewall من اجل استخدام هذا ال provider لهذا ال Firewall.
ولو حاولت الاطلاع على الملفات التي تم اضافتها وهي src/Entity/Admin.php
و src/Repository/AdminRepository.php
فتلاحظ انها تحتوي على القيم الافتراضيه والتي ايضا سوف نقوم على التعديل عليها لاحقا.
ثانيا: انشاء ملف Migration جديد وتحديث قاعدة البيانات
اثناء عملية انشاء ملف migration فاننا نقوم بتنفيذ امر make:migration
والي فيه يتم انشاء ملف migration جديد بناء علي اي تعديلات تمت على تعريف ملفات Entities الموجوده في النظام ، وبمعنى ابسط فانه عند تنفيد هذا الامر تقوم سمفوني بالبحث عن اي اضافات جديده في مجلد Entity او اية تعديلات تمت على الملفات الموجوده اصلا في مجلد Entity وبناء عليه تقوم بانشاء ملف Migration جديد ووضع الملف في مجلد migrations (مثال migrations/Version20240410215723.php
) من اجل التطبيق في قاعده البيانات لاحقا[٦].
لهذا فانه ولانشاء ملف migration جديد من اجل تطبيق التعديلات التي تمت اثناء انشاء كلاس Admin في الخطوه السابقه فاننا نقوم بمعاينه الملف src/Entity/Admin.php
والتاكد من ان المدخلات الموجوده بداخله صحيحه كما ينبغي (وهي كذلك في مثالنا هذا كونه الوضع الافتراضي) ثم نقوم بتنفيذ الامر التالي:
php bin/console make:migration --formatted
وهذا سوف يولد لنا ملف migration جديد في مجلد migrations ، ولتطبيق هذا الملف على قاعدة البيانات نقوم بتنفيذ الامر التالي:
php bin/console doctrine:migrations:migrate
وعند تنفيذ هذا الامر والموافقه عليه فانه سوف يتم انشاء جدول جديد في قاعده البيانات باسم admin بالحقول المذكوره في ملف src/Entity/Admin.php
ويمكنك التحقق من ذلك باستخدام phpMyAdmin او اي MySQL client اخر.

ثالثا: انشاء امر CLI من اجل انشاء Admin جديد
بما انني لن اقوم على انشاء UI من اجل تسجيل مستخدم جديد فانني سوف اقوم على انشاء امر جديد في symfony ليتم نفيده من هلال سطر الاوامر Terminal وذلك لانشاء مستخدمين جدد.
ومن اجل القيام بذلك سوف اقوم على انشاء ملف جديد فارغ باسم src/Command/CreateAdminCommand.php
وسوف اقوم باضافه المحتوى التالي الى الملف. (لاحظ انني سوف انئ المجلد Command كونه غير موجود في ملفات المشروع)
بعد انشاء الملف يمكن التحقق من ان الامر تم تعريفه بشكل صحيح ضمن اوامر console وذلك بتنفيد الامر التالي:
php bin/console list
والبحث عن الامر app:create-admin سوف تلاحظ انه موجود ضمن الاوامر ، الان سوف اقوم بانشاء المستخدم الاول عن طريف تنفيد الامر app:create-admin كالتالي:
php bin/console app:add-admin
عند تنفيذ الامر سوف يتم سؤالي مجموعه اسئله كما تم تعريفها في كود انشاء الامر ثم بعدها سوف يتم انشاء مستخدم Admin جديد بالمعلومات التي قمت بتزويدها اياه، التاليه كانت اجاباتي
Enter username: sam
Enter password:
Make this user an admin? (yes/no): yes
Admin User created successfully.
وكما تلاحظ انه تم انشاء المستخدم sam في المثال اعلاه بكلمة المرور التي ادخلتها وتم اعطاءه صلاحية Admin ، يمكنك الاطلاع على جدول admin في قاعدة البيانات لاستعرض المستخدم والاطلاع عليه.

رابعا: انشاء Controller و Form مسؤول عن عملية تسجيل الدخول ل Admin
الان حتى نتمكن من اتاحه الفرصه لزوار الموقع من تسجيل الدخول الي النظام فانه يجب علينا في البدايه ان نقوم بانشاء Controller[٧] و Form[٨] من اجل توفير UI لنموذج تسجيل الدخول وتوفيد المعالجه لنموذج تسجيل الدخول وفحص التوثيق Authentication بناء على المعلومات المدخله من الزائر في نموذج تسجيل الدخول.
انشاء Controller خاص ب AdminLogin
نقوم بتنفيذ الامر التالي:
php bin/console make:controller AdminLogin
والذي سوف يقوم بانشاء ملفين هما:
src/Controller/AdminLoginController.php
وهو ملف الكونتلولر (المتحكم) الذي سوف يكون مسؤول عن اداره عملية تسجيل الدخول.templates/admin_login/index.html.twig
وهو ملف القالب الذي يحتوي على ال UI الخاص بنموذج الدخول.
(يمكن تعديل اسم القالب ومكان موجوه لاي اسم اخر ترغب به مع تعديل مكانه في ال controller ولكن انا سوف ابقي عليه كما هو).
تحتوي تلك الملفات على بيانات افتراضيه (يمكنك الاطلاع على البيانات الافتراضيه لتلك الملفات بالنقد على اسم كل ملف اعلاه) ، ويجب علينا العمل على تعديل محتوى تلك الملفات لتعمل كنظام لتسجيل الدخول. ولهذا اول ما سوف نقوم بتغييره هو ملف src/Controller/AdminLoginController.php
حيث سوف يكون كما يلي:
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
class AdminLoginController extends AbstractController
{
#[Route('/admin/login', name: 'app_admin_login')]
public function index(AuthenticationUtils $authenticationUtils): Response
{
// Check if the user is already logged in
if ($this->getUser()) {
// Check if the user is an admin
if (in_array('ROLE_ADMIN', $this->getUser()->getRoles())) {
//@TODO you have to define the backend_dashboard route or you will get error
return $this->redirectToRoute('backend_dashboard');
}
// If not an admin, redirect to the main route
//@TODO you have to define the site_index route or you will get error
return $this->redirectToRoute('site_index');
}
// get the login error if there is one
$error = $authenticationUtils->getLastAuthenticationError();
// last username entered by the user
$lastUsername = $authenticationUtils->getLastUsername();
return $this->render('admin_login/index.html.twig', [
'last_username' => $lastUsername,
'error' => $error,
]);
}
#[Route('/admin/logout', name: 'app_admin_logout')]
public function logoutAction()
{
throw new \Exception('This method can be blank - it will be intercepted by the logout key on your firewall');
}
}
وسوف نقوم على تحرير الملف templates/admin_login/index.html.twig
واستبدال محتواه بالكود التالي:
{% extends 'base.html.twig' %}
{% block title %}Admin Login!{% endblock %}
{% block body %}
<style>
.example-wrapper {
margin: 1em auto;
max-width: 800px;
width: 95%;
font: 18px/1.5 sans-serif;
}
.example-wrapper code {
background: #F5F5F5;
padding: 2px 6px;
}
</style>
<div class="example-wrapper">
<h1>Please Login</h1>
{% if error %}
<div style="color: #B0413E">
{{ error.messageKey|trans(error.messageData, 'security') }}
</div>
{% endif %}
<form action="{{ path('app_admin_login') }}" method="post" class="space-y-4 md:space-y-6">
<div>
<label for="username" class="">Username</label>
<input type="text" id="username" name="_username" value="{{ last_username }}" class="" placeholder="" >
</div>
<div>
<label for="password" class="">Username</label>
<input type="password" id="password" name="_password" value="{{ last_username }}" class="" placeholder="">
</div>
<div class="">
<div class="">
<input id="remember_me" aria-describedby="remember_me" name="_remember_me" type="checkbox" class="">
<label for="remember_me" class="">Remember me</label>
</div>
</div>
<div>
<button type="submit"
class="">
Sign in
</button>
</div>
</form>
</div>
{% endblock %}
وبهذا نكون قد قمنا على انشاء المحتوى الاساسي ل AdminLoginController.php
ولملف القالب index.html.twig
. اضغط على اسم الملف لمشاهدة التعديلات التي تمت عليها لتنفيد واجهة UI ومعالجتها.
خامسا: انشاء منطقه (مورد جديد Route) في النظام وحمايته بالـ Firewall الذي يتطلب تسجيل دخول Admin
سوف اقوم على انشاء Controller جديد بالرابط /Backend وذلك بانشاء controller جديد باسم Backend من خلال الامر:
php bin/console make:controller Backend
الهدف من انشاء هذا ال Controller هو توفير صفحه تجريبيه نقوم بحمايتها بنظام تسجيل الدخول بحيث يمنع الوصول لها الا بعد ان يتم تسجيل الدخول.
يمكنك الاطلع على ال controller الذي تم انشاءه على الرابط التالي.
بعد انشاء الصفحه ياتي دور حمايتها وهو الجزء الاهم ويتم ذلك من خلال تحرير الملف config/packages/security.yaml
و تحديدالصفحه التني تم انشائها ضمن control_access كما يلي:
access_control:
- { path: ^/backend, roles: ROLE_ADMIN }
كما تلاحظ في الكود اعلاه فاننا قمنا على تحديد المسار /backend بانه يتطلب role (صلاحية) ROLE_ADMIN
كما تلاحظ ان تم تعريف المسار على انه ^/backend
وهو عبارة عن pattern والتي تعني اي مسار يبدا ب /backend مثلا /backend/art , /backend/second ... وهكذا.
الان يجب علينا ايضا التعديل على firewall في ملف config/packages/security.yaml
لنقوم بتعريف الراوت route المسؤول عن تسجيل الدخول وتسجيل الخروج لهذا ال firewall وذلك كما يلي:
firewalls:
main:
form_login:
login_path: app_admin_login
check_path: app_admin_login
logout:
path: /admin/logout
lazy: true
provider: app_user_provider
وحتى تكون الصوره اوضح يمنك الاطلاع على الرابط التالي الذي يوضح التعديلات التي قمت بها على ملف config/packages/security.yaml
من اجل حمايه /backend/* من خلال firewall main.
الان يمكنك تشغيل المشروع عن طريق
symfony server:start
او من خلال الويب سيرفر لديك في بيئة التطوير وزياره الرابط
http://localhost/backend
وسوف تلاحظ انه سوف يقوم بتوجيهك الى admin/login
يطلب منك تسجيل الدخول , قم على تسجيل الدخول بمعلومات المشرف الذي انشئتهه وبهذا يكون قو توفر لدينا نظام للعضويات يتضمن Authentication و Authorization.
لتسجيل الخروج قم على زيارة الرابط
http://localhost/admin/logout
اخيرا في هذا القسم قمت على اضافه رابط تسجيل الخروج الى قالب backend UI وقمت بتحسيت AdminLogin Controller بتوجيه المستخدم الى app_backend في حاول حاول الذهاب الي نموذح تسجيل الدخول وهو مسجل الدخول بالفعل. راجع التعديلات.
ملاحظات
- ارجو الملاحظة ان ما ورد اعلاه في هذا البحث من شروحات هو لغايات التعليم والشرح وهو ليس مثاليا لبيئات الانتاج حيث اننا لم نطبق حمايه csrf للنموذج ولم اعطى اي انتباه لحمايه النموذج من خلال ضبط rete limit وبالتالي فان امر الحمايه بحاجه للتحسين بشكل اكبر ، حيث ان الهدف فقط هو توضيح Authentication و Authorization في Symfony وكيف يمكن تطبيقها باستخدام Symfony Security Bundle.
- هذا البحث هو بداية لمجموعة من الشروحات ذات العلاقه ب Symfony Authentication and Authorization حيث سوف يتم التوسع فيها باذن الله لتشمل شروحات لطرق توثيق اخرى بما في ذلك الدخول من خلال رقم الهاتف واستخدام OTP و 2FA و SMS. لهذا كان لا بد من كتابه هذا المقال ليكون مدخل. يمكنك التحقق من صفحة Symfony علي ويكي عرب اندكس بين الحين والاخر لمشاهدة المواضيع التي جرى كتابتها حول Symfony.
المصادر والمراجع
التالية هي قائمة بمصادر ومراجع استخدمت اثناء اعداد هذا البحث:
- ↑ Security Bundle Component ، موقع Symfony الرسمي https://symfony.com/components/Security%20Bundle
- ↑ https://symfony.com/doc/current/setup.html#technical-requirements
- ↑ https://symfony.com/doc/current/security.html
- ↑ https://symfony.com/doc/current/security.html#the-firewall
- ↑ https://github.com/mshannaq/symfony-access-control-research/tree/username-and-password-normal-login
- ↑ https://symfony.com/doc/current/doctrine.html
- ↑ https://symfony.com/doc/current/controller.html
- ↑ https://symfony.com/doc/current/forms.html