Skip to content
KitploitKITPLOIT
أدواتالمدونة
إرسال
أدواتالمدونة
إرسال

أدوات الاختراق واختبار الاختراق والأمن السيبراني لترسانتك الأمنية!

Kitploit هو دليل لأدوات الاختراق والأمن السيبراني واختبار الاختراق. اكتشف آخر تحديثات المشاريع للعثور على الثغرات وتحليل الأنظمة وأتمتة الاختبارات وتعزيز أمنك.

··الخلاصات·اتصال·الخصوصية·© 2026 Kitploit

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
declarative-policy — مكتبة ترخيص تصريحي مع لغة مجال خاصة (DSL) لكتابة قواعد السياسات والشروط والتخزين المؤقت. تتيح إدارة أذونات قابلة للتوسع ومبدأ DRY لتطبيقات Ruby. | Kitploit
أدوات/GitLabGitLab/gitlab-org/ruby/gems/declarative-policy
المصادقة والترخيصالأدوات والمكونات
GitLabgitlab-org/ruby/gems/declarative-policy

declarative-policy

مكتبة ترخيص تصريحي مع لغة مجال خاصة (DSL) لكتابة قواعد السياسات والشروط والتخزين المؤقت. تتيح إدارة أذونات قابلة للتوسع ومبدأ DRY لتطبيقات Ruby.

عرض المستودع

الأكثر شعبية

عرض الكل →

اكتشف الأدوات الأكثر استخدامًا من قبل مجتمعنا.

استكشف جميع الأدوات

تصفح مجموعتنا من الأدوات

عرض جميع الأدوات →
مشاركة
1710منذ 5 أشهرلم تتم المراجعة بعد

DeclarativePolicy: مكتبة تفويض تعريفية

Gem Version

توفر هذه المكتبة لغة مجال خاصة (DSL) لكتابة سياسات التفويض.

يمكن استخدامها لفصل المنطق عن الأذونات، وقد تم استخدامها على نطاق واسع في الإنتاج في GitLab.com.

المؤلف الأصلي لهذه المكتبة هو Jeanine Adkisson، وحقوق النشر محفوظة لـ GitLab.

التثبيت

أضف هذا السطر إلى ملف Gemfile الخاص بتطبيقك:

root@kitploit:~
gem 'declarative_policy'

ثم قم بتنفيذ:

root@kitploit:~
$ bundle install

أو قم بتثبيته بنفسك كما يلي:

root@kitploit:~
$ gem install declarative_policy

مثال

root@kitploit:~
require 'declarative_policy'

class User
  attr_reader :name

  def initialize(name:)
    @name = name
  end
end

class Vehicle
  def initialize(owner:, trusted: [])
    @owner = owner
    @trusted = trusted
  end

  def owner?(user)
    @owner.name == user.name
  end

  def trusted?(user)
    @owner.name == user.name || @trusted.detect { |t| t.name == user.name }
  end
end

class VehiclePolicy < DeclarativePolicy::Base
  condition(:owns) { @subject.owner?(@user) }
  condition(:trusted) { @subject.trusted?(@user) }

  rule { owns }.enable :sell_vehicle
  rule { trusted }.enable :drive_vehicle
end

jack = User.new(name: 'jack')
jill = User.new(name: 'jill')
jacks_vehicle = Vehicle.new(owner: jack, trusted: [jill])
jills_vehicle = Vehicle.new(owner: jill, trusted: [jack])

puts "Jack can drive Jack's vehicle? -> #{DeclarativePolicy.policy_for(jack, jacks_vehicle).can?(:drive_vehicle)}"
puts "Jack can drive Jill's vehicle? -> #{DeclarativePolicy.policy_for(jack, jills_vehicle).can?(:drive_vehicle)}"
puts "Jack can sell Jack's vehicle? -> #{DeclarativePolicy.policy_for(jack, jacks_vehicle).can?(:sell_vehicle)}"
puts "Jack can sell Jill's vehicle? -> #{DeclarativePolicy.policy_for(jack, jills_vehicle).can?(:sell_vehicle)}"
root@kitploit:~
$ ruby example.rb
Jack can drive Jack's vehicle? -> true
Jack can drive Jill's vehicle? -> true
Jack can sell Jack's vehicle? -> true
Jack can sell Jill's vehicle? -> false

الاستخدام

التجريد الأساسي لهذه المكتبة هو Policy. تجمع السياسات بين:

  • الحقائق (تسمى conditions) حول حالة العالم
  • الأحكام حول هذه الحقائق (تسمى rules)

توجد هذه المكتبة لتحديد القيمة الحقيقية للعبارات من الشكل:

root@kitploit:~
User Predicate [Subject]

تتم مناقشة إعادة تسمية User إلى Actor و Subject إلى Resource في هذه المشكلة.

على سبيل المثال:

  • user :is_alive
  • user :can_drive car
  • user :can_sell car

يقوم بذلك عن طريق السماح لنا بربط Policy (مجموعة من القواعد حول أي العبارات صحيحة) بأشياء الجمل. تعتبر العبارة صحيحة إذا لم تمنعها أي قاعدة prevents، وكانت هناك قاعدة واحدة على الأقل تمكنها enables.

على سبيل المثال، تخيل أن لدينا نموذج بيانات يحتوي على مركبات ومستخدمين، ونريد معرفة ما إذا كان يمكن للمستخدم قيادة مركبة. نحتاج إلى VehiclePolicy:

root@kitploit:~
class VehiclePolicy < DeclarativePolicy::Base
  # relevant facts
  condition(:owns) { @subject.owner == @user }
  condition(:has_access_to) { @subject.owner.trusts?(@user) }
  condition(:old_enough_to_drive) { @user.age >= laws.minimum_age }
  condition(:has_driving_license) { @user.driving_license&.valid? }
  # expensive rules can have 'score'. Higher scores are 'more expensive' to calculate
  condition(:owns, score: 0) { @subject.owner == @user }
  condition(:has_access_to, score: 3) { @subject.owner.trusts?(@user) }
  condition(:intoxicated, score: 5) { @user.blood_alcohol > laws.max_blood_alcohol }

  # conclusions we can draw:
  rule { owns }.enable :drive_vehicle
  rule { has_access_to }.enable :drive_vehicle
  rule { ~old_enough_to_drive }.prevent :drive_vehicle
  rule { intoxicated }.prevent :drive_vehicle
  rule { ~has_driving_license }.prevent :drive_vehicle

  # we can use methods to abstract common logic
  def laws
    @subject.registration.country.driving_laws
  end
end

بعض النقاط التي يجب ملاحظتها: كان يمكننا كتابة هذا كقاعدة واحدة كبيرة (owns | has_access_to) & old_enough_to_drive & ~intoxicated & has_driving_license ولكن يمكننا رؤية بعض الميزات التي تجعل السياسات التعريفية قابلة للتوسع للأنظمة الكبيرة: يمكن تقسيم القواعد إلى عناصر صغيرة، وتكوينها في قواعد أكبر. يمكن إضافة شروط وقواعد جديدة في أي وقت.

ما يصعب رؤيته هو أن العديد من تحسينات الأداء تتم معالجتها بشفافية:

  • يتم استدعاء الشروط الأكثر تكلفة لاحقًا
  • نحصل تلقائيًا على التجميعات المرغوبة (تقييم جميع الشروط التي قد تمنع إجراءً ما، ولكن التوقف بمجرد حصولنا على استدعاء واحد على الأقل للتمكين).
  • يتم تخزين القيم الوسيطة مؤقتًا.
  • تدعم السياسات الوراثة والتفويض، مما يعني أن منطق التفويض يظل جافًا (DRY).

باختصار، تهدف هذه المكتبة إلى أن تكون تعريفية: نعلن القواعد المهمة، وتقوم المكتبة بترتيب كيفية تقييمها.

التخزين المؤقت هو ميزة قيمة بشكل خاص للسياسات. إذا أضفنا قواعد جديدة حول بيع مركبة، على سبيل المثال:

root@kitploit:~
rule { owns }.enable :sell_vehicle

ثم يمكن مشاركة حقيقة الملكية بين استدعاءات مختلفة للسياسة، مما يوفر استدعاءات قاعدة البيانات وعمليات الإدخال/الإخراج المكلفة الأخرى.

تقييم السياسة:

يمكننا التحقق من قرار السياسة باستخدام:

root@kitploit:~
cache = Session.current_session
policy = DeclarativePolicy.policy_for(user, car, cache: cache)
policy.can?(:drive_vehicle)

لمزيد من التفاصيل حول الاستخدام، راجع الوثائق.

التطوير

بعد سحب المستودع، قم بتشغيل bundle install لتثبيت التبعيات. ثم قم بتشغيل rake spec لتشغيل الاختبارات. يمكنك أيضًا تشغيل bin/console للحصول على موجه تفاعلي يسمح لك بالتجربة.

لتثبيت هذه الجوهرة على جهازك المحلي، قم بتشغيل bundle exec rake install. لإصدار نسخة جديدة، قم بتحديث رقم الإصدار في version.rb، ثم قم بتشغيل bundle exec rake release، والذي سينشئ علامة git للإصدار، ويدفع التزامات git والعلامات، ويدفع ملف .gem إلى rubygems.org.

مواد قراءة إضافية

يمكن العثور على مزيد من التفاصيل حول السياسات والأدوار المخصصة في الصفحات التالية:

  • عملية التطوير لإطار DeclarativePolicy
  • وثائق الأدوار المخصصة

المساهمة

تقارير الأخطاء وطلبات الدمج مرحب بها على GitLab على https://gitlab.com/gitlab-org/ruby/gems/declarative-policy. هذا المشروع يهدف إلى أن يكون مساحة آمنة ومرحبة للتعاون، ومن المتوقع أن يلتزم المساهمون بـ مدونة قواعد سلوك GitLab.

عملية الإصدار

نقوم بإصدار declarative_policy على أساس مخصص. لا يوجد انتظام لموعد الإصدار، نحن نصدر فقط عندما نقوم بتغيير - بغض النظر عن حجم التغيير.

لإصدار نسخة جديدة:

  1. إنشاء طلب دمج.
  2. استخدام قالب طلب الدمج Release.md.
  3. اتبع التعليمات.
  4. بعد دمج طلب الدمج، يتم نشر إصدار جديد من الجوهرة تلقائيًا.
  5. بمجرد أن يصبح إصدار الجوهرة الجديد مرئيًا على RubyGems.org، يوصى بتحديث ملف Gemfile الخاص بـ GitLab لرفع إصدار جوهرة declarative_policy Ruby إلى الإصدار الجديد أيضًا.

الترخيص

الجوهرة متاحة كمصدر مفتوح بموجب شروط رخصة MIT.

مدونة قواعد السلوك

من المتوقع أن يتبع كل من يتفاعل مع قاعدة شفرة مشروع DeclarativePolicy، ومتتبعات المشكلات، وغرف الدردشة، والقوائم البريدية مدونة قواعد السلوك.

تنزيل الأداة