أرشيف لـفبراير, 2012

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

 

أما مرشح الرئاسة اللي اختارته هو

 

Advertisements