سنقوم بتثبيت البندل الخارجي FOS User الذي يشكل نظام تسيير متكامل للزوار، بما يشمل تسجيلهم في الموقع عن طريق الإيميل و كل ما يلي ذلك من تأكيد الإيميل و تغيير رقم السر، بطبيعة الحال يوفر هذا البندل و فوقه سيمفوني أقصى درجات الأمن و الحماية المتوفرة. و يوجد نظام تخويل و تحقيق في سيمفوني مع فوس يوزر قوي و سلس الإستعمال كما سنرى. لكن قبل ذلك سنقوم بتثبيت و تفعيل و تهيئة فوس يوزر

 

  1. تثبيت البندل

 

لتثبيت هذا البندل نستعمل الكومپوزر Composer مع تحديد نسخة البندل ( في مثالنا نعمل بسيمفوني 3.2 الذي لا تناسبه إلا النسخة من فوس يوزر التي في طور الإختبار، لذلك كتبنا "2.0 dev"

C:\xampp\htdocs\symf3>composer require friendsofsymfony/user-bundle "~2.0@dev"
./composer.json has been updated
...
...
[OK] All assets were successfully installed.

لم نورد جريدة التثيبت كاملة، أوردنا فقط سطرين مهمين الأول يعلمنا ان الملف كومپوزر قد تم تحديثه و في الاخير ان التثبت كان ناجحا. بإمكانكم التأكد بالذهاب الى الملف vendor حيث ستجدون ملفا جديدا إسمه friendsofsymfony.

 

  1. تفعيل البندل

 

لتفعيل البندل داخل تطبيقنا نقوم ببساطة بإضافته للملف app\AppKernel.php الى جانب البنادل الموجودة مسبقا كما يلي:

    //
    
    public function registerBundles()
    {
        $bundles = [
            //
            new FOS\UserBundle\FOSUserBundle(),
            //
        ];
   //

 

  1. تهييء البندل و إستعماله

 

  • التهيئة الأمنية :

تتم التهيئة الامنية في الملف app\config\security.yml، قوموا بتحديثه كما يلي ( إنتباه مع اليامل، توجد بالضبط اربعة فراغات قبل encoders و 8 قبل AppBundle\Entity\User و فراغ واحد بالضبط بين ":" و  sha512 )

security:
    encoders:
        AppBundle\Entity\User: sha512

    role_hierarchy:
        ROLE_ADMIN:       [ROLE_AUTEUR, ROLE_MODERATEUR]  
        ROLE_SUPER_ADMIN: [ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH]

    providers:
        main:
            entity
                class: AppBundle\Entity\User
                property: username

    firewalls:
        dev:
            pattern:  ^/(_(profiler|wdt)|css|images|js)/
            security: false
        main:
            pattern:  ^/
            anonymous: true
            provider: main
            form_login:
                login_path: fos_user_security_login
                check_path: fos_user_security_check
                provider: main

    access_control:
        - { path: ^/admin, roles: ROLE_ADMIN }

 

قليلا من الشرح، سيمفوني يفرق بين مفهومين في امن الانظمة، و هما التحقيق و التخويل،
- التحقيق دور الفايروال Firwall و يعني معرفة هوية المستخدم ( مجهولة او يتعلق الامر بمستخدم متسجل)، و بالإمكان برمجة الفايروال ليسمح بالمرور او لا لموضع معين في شجرة الموقع. أعلاه نسمح بذلك في كافة الموقع.
- التخويل، التخويل يأتي بعد الفايرول، بمعنى أن المستخدم مسموح له بالولوج للموقع في الشجرة، التخويل هو من سيحدد ما يمكن عرضه او لا حسب الدور (role) المخول له.

 

  • تحديد عناصر تهيئة فوس يوزر:

ليصبح البندل جاهزا للإستعمال، نقوم بوضع تهيئته لسيمفوني، و ذلك بإضافة ما يشبه ما يلي الى الملف app\config\config.yml

 

# FOSuser
fos_user:
    db_driver: orm
    firewall_name: main
    user_class: AppBundle\Entity\User
    service:
        mailer: fos_user.mailer.twig_swift
    from_email:
        address: "administration@bayna.net"
        sender_name: "noreply"
    registration:
        confirmation:
            from_email:
                address:        "administration@bayna.net"
                sender_name:    "admin"
            enabled:    true

 

  • خلق فئة يوزر الخاصة بنا:

ما وضعناه أعلاه في تهيئة عناصر فوس يوزر يفترض بنا خلق فئة جديدة AppBundle\Entity\User، و لذلك سنقوم ببساطة بالإرث من الفئة الموجودة في ملف فوس يوزر :

vendor\friendsofsymfony\user-bundle\Model\User.php

للقيام بذلك نجعل ببساطة المحتوى التالي في ملف جديد  AppBundle\Entity\User.php

 

<?php

namespace AppBundle\Entity;

use FOS\UserBundle\Model\User as BaseUser;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 * @ORM\Table(name="user")
 */
class User extends BaseUser {

    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

}

ثم كما وضحنا في الدرس السابق، الفصل المخصص للفئات العلائقية ORM، نطلب من bin/console إذا كان هناك من جديد في الانماط ( dum-sql) فيكون الجواب إن مر كل شيء على ما يرام هو:

 

C:\xampp\htdocs\symf3>php bin/console doctrine:schema:update --dump-sql
CREATE TABLE user (id INT AUTO_INCREMENT NOT NULL, username VARCHAR(180) NOT NUL
L, username_canonical VARCHAR(180) NOT NULL, email VARCHAR(180) NOT NULL, email_
canonical VARCHAR(180) NOT NULL, enabled TINYINT(1) NOT NULL, salt VARCHAR(255)
DEFAULT NULL, password VARCHAR(255) NOT NULL, last_login DATETIME DEFAULT NULL,
confirmation_token VARCHAR(180) DEFAULT NULL, password_requested_at DATETIME DEF
AULT NULL, roles LONGTEXT NOT NULL COMMENT '(DC2Type:array)', UNIQUE INDEX UNIQ_
8D93D64992FC23A8 (username_canonical), UNIQUE INDEX UNIQ_8D93D649A0D96FBF (email
_canonical), UNIQUE INDEX UNIQ_8D93D649C05FB297 (confirmation_token), PRIMARY KE
Y(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB;

 

للتفعيل، نلعب نفس الامر متبوعا ب force

 

C:\xampp\htdocs\symf3>php bin/console doctrine:schema:update --force
Updating database schema...
Database schema updated successfully! "1" query was executed

C:\xampp\htdocs\symf3>

 

قد لا تكفينا الخاصيات المدمجة في الفئة يوزر user و التي ورثناها عن البندل فوس يوزر Fos user؛ مثلا نريد خلق خاصية جديدة "تاريخ النشر" datePub. في هذه الحالة نقوم بتعديل الملف  AppBundle\Entity\User.php كما يلي ثم نفعل التعديل في قاعدة البيانات كما فعلنا اعلاه :

 

<?php

namespace AppBundle\Entity;

use FOS\UserBundle\Model\User as BaseUser;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 * @ORM\Table(name="user")
 */
class User extends BaseUser {

    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

	    /**
     * @var \DateTime
     *
     * @ORM\Column(name="date_pub", type="datetime")
     */
    private $datePub;


    public function __construct() {
        
        parent::__construct();
        $this->datePub = new \Datetime();
    }

    /**
     * Set datePub
     *
     * @param \DateTime $datePub
     * @return User
     */
    public function setDatePub($datePub) {
        $this->datePub = $datePub;

        return $this;
    }

    /**
     * Get datePub
     *
     * @return \DateTime 
     */
    public function getDatePub() {
        return $this->datePub;
    }


}

كل ما فعلناه هو إضافة الخاصية، ثم إضافة باني نقول له بإستعمال باني الفئة الام ثم إضافة القيمة "الآن" للخاصية تاريخ النشر

يجب إضافة الملف : AppBundle\Repository\UserRepository.php الذي سنحتاجه لولوج قاعدة البيانات ، يكفي ان نرث من فئة ORM Repository كما يلي :

<?php

namespace AppBundle\Repository;

class UserRepository extends \Doctrine\ORM\EntityRepository
{
}

 

  • تهيئة الطرقات/العناوين (routing):

 

يتوفر البندل فوس يوزر على ملف العناوين routing الخاص به، و هي عناوين الصفحات التي تأخذ على عاتقها العمليات كالتسجيل و الدخول و الخروج و تغيير رقم السر و غيرها. كل ما يلزمنا فعله لتفعيل ملف العناوين الخاص بالبندل، هو تضمينه في ملف العناوين الخاص بفوس يوزر داخل ملف العناوين الخاص بالتطبيق الذي نحن بصدد برمجته.

نقوم إذن بتحديث الملف app\config\routing.yml بإضافة ما يلي :

fos_user:
    resource: "@FOSUserBundle/Resources/config/routing/all.xml"

ملحوظة : عندما قدمت لكم أعلاه مضمون ملف التهيئة الأمنية، فإن العناوين/الطرق المضمنة ( fos_user_security_login مثلا )، موجودة في ملف العناوين الخاص بفوس يوزر ( يمكنكم التأكد من ذلك).

 

الآن بالذهاب للصفحة http://localhost/symf3/web/app_dev.php/login هذا ما يفترض أن نجد:

 

و كذلك إذا ذهبنا للصفحة http://localhost/symf3/web/app_dev.php/register سنجد إستمارة التسجيل

 

أخيرا، لم يتبقى لنا إلا تعديل التومبليت تويغ ( مباشرة في ملف البندل fos-user ) ليتماشى و ما نريده.