الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

RBAC بكل سهولة

بدأه ahmed_youssef في 14 فبراير 2012 · 0 رد · 637 مشاهدة · في لغة Python
مشاركة: واتساب X فيسبوك تيليجرام
#1

السلام عليكم

أنا معجب جدا بال RBAC وكتبت في السابق مكتبة ل CodeIgniter

على كل حال كتبت حزمة لبايثون تستطيع تنصيبها عبر

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 سخيفة نوعا ما

مرحبا بالنقاش وأيضا لمن يحب توفير ملفات أخرى لتخزين المدخلات مثل XML او YAML أهلا وسهلا

تم تعديل هذه المشاركة بواسطة ahmed_youssef في 14 فبراير 2012 في 18:14

1
(map share people)

فضلا لاتقم بمراسلتي من أجل أسئلة لها أقسامها في المنتدى حتى تعم الفائدة على الجميع وللحصول على إجابات أفضل من أعضاء أكثر خبرة.
Weblog
@bitbucket
@xmonader

مواضيع مشابهة