المكان المناسب لاقتراح مسند صلاحيات؟

من أجل اقتراح حل لـ https://meta.discourse.org/t/restrict-exposure-of-full-name-to-certain-groups/348873، أود تعريف شرط (من جانب الخادم) للتحقق من الصلاحيات يجيب على السؤال:

بناءً على نطاق/سياق المستخدم الحالي، هل من المقبول الكشف عن الأسماء الكاملة للمستخدمين (الآخرين)؟

(يمكن تعيين النطاق بواسطة طلب من العميل، أو بواسطة خطوة معالجة داخلية، مثل إنشاء رسائل بريد إلكتروني ملخصة.)

ما هو البناء الصحيح لمثل هذا الشرط؟ أين يجب أن يعيش في قاعدة الكود؟ أفكر في أن هذا ربما ينتمي إلى guardian — هل أنا على المسار الصحيح؟ أي آراء حول أي منها؟

أتخيل أن هذا الشرط الجديد سيستوعب العديد (ولكن ليس كلها) من حالات SiteSettings.enable_names? الموجودة حاليًا في قاعدة الكود. (الوصول إلى Serializers التي تنتج user.name يسد معظم تسرب البيانات، ولكن ليس كلها.) فائدة لطيفة لهذا هي أنه سيقدم نقطة امتداد يمكن من خلالها لمكون إضافي مستقبلي تغيير السلوك (وهو أمر غير ممكن حاليًا، على حد علمي، أو كنت سأفعل ذلك!). لذا، إذا نجحت في ذلك، فسيصبح هذا طلب سحب إلى نواة discourse — وأود تقديم طلب سحب لديه أمل في قبوله.

إعجاب واحد (1)

هذا ما تعلمته/استنتجته:

  • Guardian هو بالفعل الشيء الذي يغلف “ما يُسمح للمستخدم بفعله؟” (مثيل Guardian لديه مثيل User أيضًا.)
  • وبالتالي، فإن المكان المناسب لشرط الأذونات هو ببساطة كطريقة على Guardian (lib/guardian.rb).
    • إذا كانت الطريقة “هل يمكن للمستخدم القيام بـ Z لكائن Xxxx؟” فمن المحتمل أن تنتمي إلى أحد ملفات XxxxGuardian المختلطة (lib/guardian/...).
    • بخلاف ذلك، تذهب إلى التعريف الأساسي لـ Guardian.
  • يدير ApplicationController سمة guardian تعكس الطلب/العميل الحالي، ويوفرها للمسلسلات كـ scope الخاص بها، لذلك يتوفر Guardian الحالي عند الحاجة (باستثناء عندما لا يكون كذلك[1])
  • هناك أماكن لا يتوفر فيها Guardian جاهز، عادةً في مهمة خلفية يديرها النظام، ولكن إذا كان لديك مقبض على “مستخدم عامل” (على سبيل المثال، المستخدم المستلم، عند إنشاء إشعار بريد إلكتروني)، يمكنك إنشاء guardian مناسب في الوقت المناسب: Guardian.new(the_user).

  1. ↩︎