السلام عليكم ورحمة الله وبركاته

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

  • فلنفرض أن لدينا 30 صلاحية سيتم تمثيل تلك الصلاحيات كسلسة نصية مكونة من الصفر والواحد كالتالي:

    001100000011101010010100110000

الصفر يرمز لعدم تمكين الصلاحية والواحد يرمز لتمكين الصلاحية

  • ستكون لدينا مصفوفة باسماء الصلاحيات المطلوبة -ويمكنك زيادتها او انقاصها دون تاثير على سير العملية- مفتاح كل قيمة في المصفوفة للصلاحية يناظرة مفتاح لقيمة الصلاحية في السلسة النصية، وعلى هذا يُمكننا بسهولة إعطاء ونزع الصلاحيات للمُستخدمين بسلاسة ولأي عدد من الصلاحيات بتغيير قيمة السلسة النصية على حسب الصلاحيات بما يُناظر كل صلاحية في المصفوفة.

التالي فئة بلغة php لتنفيذ هذه الطريقة -يمكنك تنفيذ الطريقة باللغة التي تُفضلها-:

<?php
class permissions
{
    // مصفوفة لتخزين اسماء الصلاحيات التي ستُستخدم
    private $permissions = [];

    // باني الفئة
    public function __construct()
    {
        // مصفوفة بجميع الصلاحيات المُتاحة
        // عينة من بعض الصلاحيات لنظام ما
        $this->permissions = [  'carAdd','carEdit','carDelete','carEditName','carEditModel','carEditPower',
                                'carEditPrice','carEditColor','carEditCompany','carEditCurancy','carEditMotor',
                                'motoAdd','motoEdit','motoDelete','motoEditName','motoEditModel','motoEditPower',
                                'motoEditPrice','motoEditColor','motoEditCompany','motoEditCurancy','motoEditMotor',
                                ];
    }
    // دالة اختبار الصلاحية
    // تقوم الدالة بإختبار الصلاحية المُممرة للدالة على المُستخدم النشط
    // تعيد الدالة القيمة الصحيحة في حال كان المُستخدم يمتلك تلك الصلاحية
    // تعيد الدالة القيمة الخاطئة في حال كان المُستخدم النشط لا يملك تلك الصلاحية
    public function permission($permissionName)
    {
        if(!in_array($permissionName, $this->permissions))
            return false;

        $userPermissions = $this->getUserPermissons();
        $key = $this->key($permissionName);
        if(!isset($userPermissions[$key]) || $userPermissions[$key] != 1)
            return false;
        else
            return true;
    }

    // دالة إضافة صلاحيات مُستخدم جديد
    // تكون الصلاحيات عبارة عن صناديق اختيار بنفس اسماء الصلاحيات للتحقق منها
    // تقوم الدالة بإعادة سلسة نصية مكونة من الصفر والواحد عبارة عن صلاحيات المُستخدم الجديد
    private function addPermissions()
    {
        $userPermissions = str_pad('', count($this->permissions), '0');

        foreach($this->permissions as $value){
            if(isset($_POST[$value])){
                $userPermissions[$this->key($value)] = 1;
            }
        }
        return $userPermissions;
    }

    // دالة تعديل صلاحيات مُستخدم موجود
    // تكون الصلاحيات عبارة عن صناديق اختيار بنفس اسماء الصلاحيات للتحقق منها
    // تقوم الدالة بإعادة سلسة نصية مكونة من الصفر والواحد بعد تعديل صلاحيات المُستخدم
    // يتم تخزين سلسة الصلاحيات الجديدة للمُستخدم في قاعدة البيانات أو أي وحدة تخزين أُخرى
    private function editPermissions($userPermissions)
    {
        $userPermissions = str_pad($userPermissions, count($this->permissions), '0');

        foreach($this->permissions as $value){
            if(isset($_POST[$value]))
                $userPermissions[$this->key($value)] = 1;
            else
                $userPermissions[$this->key($value)] = 0;
        }
        return $userPermissions;
    }


    // تقوم هذه الدالة بإعادة صلاحيات المُستخدم النشط كسلسة نصية
    // تكون هذه السلسة مُخزنة كقيمة في جدول المُستخدمين ولكل مُستخدم سلسة نصية شبية بالتالية
    public function getUserPermissons()
    {
        return '0001101011110001000111';
    }

    // دالة لإعادة مفتاح القيمة في المصفوفة
    private function key($value)
    {
        return array_search($value, $this->permissions);
    }
}


$perm = new permissions();

// للتحقق من الصلاحية
if($perm->permission('carAdd'))
    echo "can add car";
else
    echo "can't add car";