easy_install rbac
وتشمل وحدتين
1- simplerbac
2- dbrbac
الأولى تقدم لك SimpleAuthManager وهو مناسب جدا إذا الموارد التي ستتحكم فيها قليلة نوعا ما والثاني DBAuthManager وهو يقوم بتخزين الموارد والصلاحيات عليها في قاعدة بيانات (يتطلب منك SQLAlcemey وبإذن الله سيتوافر آخر ل Django)
يتميز كلا منها بالقدرة على قراءة ال authitems -(وهي إما role او task او operation وتفاصيلهم) -بالإضافة لصلاحيات المستخدمين من خلال ملفات إعداد مسبقة مثل json او ini وهذا سيتم توضيحه في الأمثلة التالية
أنظر إلى المثال التالي
def testINI(): import io s=""" [authitems] admin=role taskmanagement=task user=role topic.create=operation topic.read=operation topic.update=operation topic.delete=operation [taskmanagement] childs=topic.read topic.create topic.read topic.update topic.delete description= topic crud task [admin] childs=taskmanagement description=admin role [user] childs=topic.read topic.create [topic.create] description=create topic [users] 1=user topic.delete 2=user """ fp=io.BytesIO(s) sm=SimpleAuthManager() sm.init_from_ini(fp) print sm.get_user_caps(1) print "admin can topic.delete", sm.can("admin", "topic.delete") print "user can topic.delete", sm.can("user", "topic.delete") print "user 1 can topic.delete", sm.user_can(1, "topic.delete") print "user 2 can topic.delete", sm.user_can(2, "topic.delete")
يتم تعريف ال authitems في قسم خاص بها
ثم إذا كان هناك تعريفات ل authitem معينة مثل الوصف او الأبناء فيتم وضعها في قسم خاص بها
اما المستخدمين فيتم تعريف صلاحياتهم في قسم users حيث يحتوي كل صف على رقم المستخدم في مقابل السماحيات المتاحة له
كيفية العمل:
1- إنشاء الكائن من الصف المناسب SimpleAuthManager او DBAuthManager
2- إنشاء الصلاحيات وتحديدها إما عبر صيغة ini او json أو يدويا كما سنرى في مثال لاحق
3- الإستعلام عبر can لإختبار صلاحيات authitem على authitem اخر و user_can لإختبار صلاحيات مستخدم على authitem معينة
ملاحظة عن ال AuthItems
ال AuthItem هو طبقة أعلى لوصف Role او Task او Operation
فمثلا في موقعنا نجد هناك عدة عمليات على مورد مثل المواضيع فيكون هناك operations مثل topic.create لإنشاء المواضيع و topic.read للإطلاع على المواضيع و topic.update لتحديث المواضيع و topic.delete لحذف المواضيع وبصورة أشمل كل هذه العمليات الخاصة بالمواضيع نستطيع وصفها بمهمة Task وهي إدارة المواضيع
ففي موقعنا يوجد 3 roles واحد منها هو المستخدم user وله صلاحيات محددة مقيدة بالoperations الخاصة بالإنشاء والإطلاع والتحديث للمواضيع وليس له صلاحيات الحذف
المشرفين لهم كل صلاحيات المستخدم بالإضافة لصلاحية حذف الموضوعات فعليه بدل مانقوم بإسناد كل ال operations للمشرفين فإننا نضع هذه ال operations تحت مهمة taskManagement مثلا ونقوم بإسناد هذه المهمة للrole الخاصة بالمشرفين وليكن moderators
ويوجد role اخرى وهي مدير الموقع وله كل صلاحيات المشرفين بالإضافة لعملية فتح وغلق المنتدى فنجد ان role الخاصة به admin تحتوي على role المشرفين بالإضافة ل operation مثل forums_offline_control
النظر لهذا المثال يعطيك فكرة جيدة
def testINI(): import io s=""" [authitems] admin=role taskmanagement=task user=role topic.create=operation topic.read=operation topic.update=operation topic.delete=operation [taskmanagement] childs=topic.read topic.create topic.read topic.update topic.delete description= topic crud task [admin] childs=taskmanagement description=admin role [user] childs=topic.read topic.create [topic.create] description=create topic [users] 1=user topic.delete 2=user """ fp=io.BytesIO(s) sm=SimpleAuthManager() sm.init_from_ini(fp) print sm.get_user_caps(1) print "admin can topic.delete", sm.can("admin", "topic.delete") print "user can topic.delete", sm.can("user", "topic.delete") print "user 1 can topic.delete", sm.user_can(1, "topic.delete") print "user 2 can topic.delete", sm.user_can(2, "topic.delete")
مثال ل DBAuthManager مع json
from rbac import DBAuthManager, set_db def testDBJSON(): s=""" { "acl":{ "items":["admin","user","taskmanagement", "topic.create", "topic.delete", "topic.read", "topic.update"], "admin":{ "type":"role", "description":"admin role", "childs":["taskmanagement"] }, "user":{ "type":"role", "description":"user role", "childs":["topic.create", "topic.read", "topic.update"] }, "taskmanagement":{ "type":"task", "description":"topic crud", "childs":["topic.create", "topic.delete", "topic.read", "topic.update"] }, "topic.create":{ "type":"operation", "description":"topic.create operation" }, "users":{ "1":["user", "topic.delete"], "2":["user"] } } } """ set_db('sqlite:///:memory:', create=True, echo=False) sm=DBAuthManager() sm.init_from_json(s) print "admin can topic.delete", sm.can("admin", "topic.delete") print "user can topic.delete", sm.can("user", "topic.delete") print "user 1 can topic.delete", sm.user_can(1, "topic.delete") print "user 2 can topic.delete", sm.user_can(2, "topic.delete") adm=sm.item_by_name("admin") if __name__=="__main__": testDBJSON()
الدالة set_db تقوم بتحديد قاعدة البيانات و create لإنشاء الجداول و echo لعرض جمل sql التي تنفذ
الوظيفة init_from_json لتجهيز المدير بمدخلات معرفة بصيغة json
الوظيفة init_from_ini لتجهيز المدير بمدخلات معرفة بصيغة ini
*ملاحظة لمن لديه خبرة ب SQLAlchemey يستطيع تقديم يد المساعدة في dbrbac لأن العلاقات مع sqlalchemy سخيفة نوعا ما
مشروع pytorrentrename وهو لتسمية ملفات التورنت بالأسماء الأصلية لها (إذا كان ملف التورنت عبارة عن أرقام أو ماشابه) فهو يقول بإستخلاص الإسم الذي سيتم التحميل إليه وتغير اسم الملف للأسم الأصلي
اما مشروع migratex فهو مشروع لإطار العمل yii لتسهيل عمل ال migrations الخاصة بإنشاء جداول لتكون بإسلوب مشابة ل rails
./yiic migratex create create_crazyauthors name:string age:int dead:tinyint
أما مرشح الرئاسة اللي اختارته هو
🙂 مرحبا بك مع أولاد أبو اسماعيل