Authentication و Authorization في Symfony

من عرب اندكس
مراجعة ٠٣:٥٧، ٨ يونيو ٢٠٢٤ بواسطة Arbindex (نقاش | مساهمات)
(فرق) → مراجعة أقدم | المراجعة الحالية (فرق) | مراجعة أحدث ← (فرق)

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 الى ملفات المشروع ولتطبيق مبدا الدخول من خلال "اسم المستخدم" و "كلمة المرور" سوف اقوم بما يلي:

  1. انشاء كلاس Security جديد باسم Admin.
  2. انشاء ملف Migration جديد وتحديث قاعدة البيانات.
  3. انشاء امر CLI من اجل انشاء Admin جديد.
  4. انشاء Controller مسؤول عن عملية تسجيل الدخول ل Admin
  5. انشاء منطقه (مورد جديد 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

والذي سوف يقوم بانشاء ملفين هما:

  1. src/Controller/AdminLoginController.php وهو ملف الكونتلولر (المتحكم) الذي سوف يكون مسؤول عن اداره عملية تسجيل الدخول.
  2. 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.

المصادر والمراجع

التالية هي قائمة بمصادر ومراجع استخدمت اثناء اعداد هذا البحث: