كيفية تقسيم الأدوار في مشروع Laravel: نظرة عامة على حزم RBAC

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




مقدمة


في الإصدار 5.1 ، قدمت Laravel Auth Gates ، وهي وظيفة إطار مدمجة للتحكم في الوصول. حتى هذا الوقت ، كان علي استخدام حزم خارجية متنوعة. ومع ذلك ، حتى الآن ، لدى المبرمج خيار: كتابة كل شيء بنفسك أو استخدام حزمة جاهزة. الخيار الأول مناسب تمامًا للمشاريع الصغيرة أو المشروعات ذات النظام البسيط للحقوق والأدوار. الثاني (مع الاختيار الصحيح للحزمة) يسمح بمزيد من الضبط.

الغرض من هذه المقالة هو مراجعة الحزم الموجودة التي تطبق RBAC (التحكم في الوصول استنادًا إلى الدور) - التحكم في الوصول المستند إلى الأدوار. سنوضح على الفور أن هذه المقالة لا تدعي أنها الحقيقة المطلقة: يجب على كل مطور أن يحدد لنفسه الحزمة التي يحتاجها (إن وجدت). ملاحظة: في هذه المقالة ، نحن نفكر في RBAC ، لذلك ، في مراجعة Sentinel ، نتعامل فقط مع هذا الجزء من الوظائف المتاحة.

وصف الحزمة


Laravel إذن من Spatie


الرابط: https://github.com/spatie/laravel-permission
الوثائق: https://docs.spatie.be/laravel-permission/v3
عدد مرات التحميل (في وقت الكتابة): 3.6M
إصدار Laravel: من 5.8 للإصدار 3
وجود واجهة: لا (يمكنك استخدام الحزمة )
استنادا إلى لارافيل المصادقة: نعم

ملامح
  1. توفر أوامر الحرفيين لإنشاء / تعيين الحقوق.
  2. الانتهاء من نطاق الأدوار والحقوق.
  3. القدرة على التحقق من حقوق المستخدم باستخدام الأدوات القياسية نظرًا لحقيقة أن الحزمة تستخدم Laravel Auth Gates.
  4. القدرة على استخدام توجيهات شفرة الحزمة: دور (hasrole) ،hasanyrole ،hasallroles ،unlessrole.
  5. تزامن الحقوق والأدوار.

ملاحظة: عند استدعاء التخويل () للسياسة ، إذا كان الإذن يحمل نفس اسم السياسة ، فسوف ينجح ، وليس السياسة.

هيكل الديسيبل



أمثلة التعليمات البرمجية

//    $user->givePermissionTo('edit articles'); //    $user->assignRole('writer', 'admin'); //       $user->assignRole(['writer', 'admin']); //    $role->givePermissionTo('edit articles'); 


الحارس بواسطة جوزيف سيلبر


الرابط: https://github.com/JosephSilber/bouncer
الوثائق: https://github.com/JosephSilber/bouncer#introduction
عدد مرات التحميل (في وقت الكتابة): 418K
الإصدار Laravel: من 5.1.20
توافر واجهة: لا (يمكنك استخدام الحزمة )
استنادا إلى لارافيل المصادقة: نعم

ملامح
  1. القدرة على استخدام دون Laravel.
  2. تزامن الحقوق والأدوار.
  3. القدرة على فرض قيود على الحقوق (لفئة معينة من النماذج أو لمثيل معين).
  4. إصدار جميع الحقوق للكيانات "الخاصة بهم: باستخدام وظيفة" toOwn "، يمكنك إصدار جميع الحقوق لكيان ينتمي إلى المستخدم (يمكن تخصيص حقول user_id و $ user-> الحقول). يمكنك تقييد الحقوق الممنوحة باستخدام وظيفة "إلى".
  5. دعم التعددية (على أساس وظيفة النطاق).
  6. القدرة على استخدام وظيفة "النطاق" لفصل الأدوار والحقوق وفقًا للشروط المحددة (بناءً على معرف فريد) - على سبيل المثال ، الحقوق في لوحة المشرف والجزء العام من الموقع.
  7. أمر وحدة التحكم الحرفي لتنظيف قاعدة البيانات من إذن غير مستخدم.
  8. القدرة على حظر المستخدم بسرعة أو إزالة الحظر (القدرة المحرمة).

ملاحظة: يمكنك إنشاء دور وحقوق له بسطر واحد فقط.

هيكل الديسيبل



أمثلة التعليمات البرمجية

تقييد الحق حسب فئة النموذج أو المثيل:
 Bouncer::allow($user)->to('edit', Post::class); Bouncer::allow($user)->to('edit', $post); 


إصدار حقوق الكيانات "التابعة لها":
 Bouncer::allow($user)->toOwn(Post::class)->to(['view', 'update']); 


Laratrust التي كتبها santigarcor


الرابط: https://github.com/santigarcor/laratrust
الوثائق: https://laratrust.santigarcor.me/
عدد مرات التحميل (في وقت الكتابة): 601K
الإصدار Laravel: ~ 6.0
توافر واجهة: لا
استنادا إلى لارافيل المصادقة: لا

ملامح
  1. هذا شوكة ENTRUST ( https://github.com/Zizaco/entrust ).
  2. هناك توجيهات شفرة.
  3. نظرًا لاستبدال أوامر Laravel القياسية بأوامرها الخاصة ، من المستحيل العمل باستخدام توجيه الشفرة - يجب عليك استخدام $ user-> can ('edit-user') أو توجيه الإذن .
  4. تزامن الأدوار / الحقوق.
  5. توافر القدرة - التحقق في وقت واحد من الأدوار والحقوق.
  6. استعداد الوسيطة.
  7. التعددية القائمة على الفرق.


هيكل الديسيبل



أمثلة التعليمات البرمجية
    $user->hasRole(['owner', 'admin']); $user->can(['edit-user', 'create-post']); $user->hasRole('owner|admin'); $user->can('edit-user|create-post');   $user->owns($post) //   $post->user_id   $owner = new Role(); $owner->name = 'owner'; $owner->display_name = 'Project Owner'; // optional $owner->description = 'User is the owner of a given project'; // optional $owner->save(); 


الحارس من قبل Cartalyst


الرابط: https://github.com/cartalyst/sentinel
الوثائق: https://cartalyst.com/manual/sentinel/3.x
عدد مرات التحميل (في وقت الكتابة): 957K
لارافيل الإصدار: 6.2
توافر واجهة: لا
استنادا إلى لارافيل المصادقة: لا

ملامح
  1. لا يشمل فقط الأدوار والحقوق ، ولكن يشمل أيضًا كل ما يتعلق بالتسجيل.
  2. الحزمة هي إطار لاأدري ، أي يمكن استخدامه ليس فقط في Laravel - تحتاج فقط إلى تثبيت التبعيات التالية باستخدام الملحن: illuminate / database ، illuminate / events ، symfony / http-foundation.
  3. باستخدام الوظيفة الإضافية Sentinel Expired-أذونات ، يمكنك إصدار حقوق إلى وقت.
  4. يدعم Multitenancy مع الوظيفة الإضافية Sentinel Multitenancy.

ملاحظة: عند التثبيت على Laravel 6.2 و PostgreSQL الخالص ، يظهر خطأ أثناء الترحيل: جدول المستخدمين موجود بالفعل. في هذه الحالة ، يجب عليك تغيير الترحيل القياسي:



هيكل الديسيبل



أمثلة التعليمات البرمجية

 //   $user = Sentinel::findById(1); $role = Sentinel::findRoleByName('Subscribers'); $role->users()->attach($user); //   $admin = Sentinel::inRole('admin'); //   $user->permissions = [ 'user.create' => true, 'user.delete' => false, ]; $user->save(); //   $user->hasAccess(['user.create', 'user.update']); Sentinel::hasAnyAccess(['user.admin', 'user.update']); 


Laravel-ACL بواسطة Kodeine


الرابط: https://github.com/kodeine/laravel-acl
الوثائق: https://github.com/kodeine/laravel-acl/wiki
عدد مرات التحميل (في وقت الكتابة): 170K
الإصدار Laravel: 5.0 وما فوق
توافر واجهة: لا
استنادا إلى لارافيل المصادقة: لا

ملامح
  1. تزامن الأدوار والحقوق.
  2. حقوق الميراث.
  3. وجود توجيهات شفرة الخاص بك: الدور ، إذن .
  4. توافر الوسيطة الانتهاء.

المذكرة. بعض المشاكل والحلول أثناء الترحيل:

  • في ملف config / acl ، تحتاج إلى إضافة خيار users_table باسم جدول المستخدم لضمان ترحيل ثابت.
  • تحتاج إلى تثبيت حزمة "المذهب / dbal" على Laravel الخالص من أجل "تكوين صداقات" مع عمليات الترحيل القياسية ، وإلا فقد يحدث خطأ عند تحديث الحقول.

هيكل الديسيبل



أمثلة التعليمات البرمجية
 //   $permissionInternship = Permission::create([ 'name' => 'internships', 'slug' => [ //   'create' => true, 'view' => true, 'update' => true, 'delete' => true, ], 'description' => 'manage internships' ]); $permissionStudent = Permission::create([ 'name' => 'internships.student', 'slug' => [ //     'create' => false, ], //   'inherit_id' => $permissionInternship->getKey(), 'description' => 'student internship permissions' ]); 


Laravel-acl بواسطة Mateus Junges


الرابط: https://github.com/mateusjunges/laravel-acl
الوثائق: https://mateusjunges.imtqy.com/laravel-acl/
عدد مرات التحميل (في وقت الكتابة): 1.8K
الإصدار Laravel: 5.0 وما فوق
توفر الواجهة: نعم (النماذج الجاهزة)
استنادا إلى لارافيل المصادقة: لا

ملامح
  1. الانتهاء من نطاق.
  2. تزامن الحقوق للمجموعات.
  3. وجود توجيهات الشفرة: group ، @ elsegroup ، إذن ،sesemission ، @ allpermission ، @ allgroups ،anypermission ،anygroup
  4. وجود أوامر مدمجة للحرفيين لإنشاء مجموعات / حقوق وعرضها ، وكذلك عرض حقوق المستخدم.
  5. توفر برامج وسيطة جاهزة: PermissionMiddleware ، GroupMiddleware ، HierarchicalPermissions ، PermissionOrGroupMiddleware.
  6. توفر نماذج محددة مسبقا لإدارة الأدوار.

هيكل الديسيبل



جدول ملخص





استنتاج


كل من هذه الحزم لها مجال تطبيق خاص بها ، لذلك من المستحيل اختيار فائز واحد. وفقًا لتقديراتنا ، فإن Laravel-الأذونات و Bouncer هما الأكثر ملاءمة لنظام الأدوار المعقدة ، ولكن في الوقت نفسه هناك Laravel-ACL من Kodeine مع تسلسل هرمي للأدوار. يعد Laravel-ACL by Mateus Junges خيارًا "جديدًا" ولديه وظائف كافية لبناء مجموعة معتدلة من الأدوار. Sentinel هو حل عالمي مع مجموعة من الميزات ، بالإضافة إلى إدارة الأدوار. Laratrust هو لأولئك الذين يحبون Entrust.

أيضا ، لا يمكن للمرء أن يفشل في ذكر أدوات Laravel القياسية - البوابات والسياسات. إنها تسهل التمييز بين الوصول إلى الموارد في التطبيقات التي لا تتطلب إعدادات حقوق معقدة. إذا كان للتطبيق أدوار قليلة فقط أو لم تكن هناك حاجة إلى تسلسل هرمي ، فيمكن إغلاق احتياجاتك باستخدام Gates and Policies.

روابط مفيدة


Source: https://habr.com/ru/post/ar481796/


All Articles