التخطي إلى المحتوى الرئيسي

Functions

الدوال في المطابقات

يمكنك حتى تحديد دوال في المطابق لجعله أكثر قوة. يمكنك استخدام الدوال المدمجة أو تحديد دالة خاصة بك. تأخذ الدوال المدمجة لمطابقة المفاتيح الصيغة التالية:

bool function_name(string url, string pattern)

تعيد قيمة بوليانية تشير إلى ما إذا كان الـ url يطابق الـ pattern.

الدوال المدمجة المدعومة هي:

دالةurlpatternمثال
keyMatchمسار URL مثل /alice_data/resource1مسار URL أو نمط * مثل /alice_data/*keymatch_model.conf/keymatch_policy.csv
keyMatch2مسار URL مثل /alice_data/resource1مسار URL أو نمط : مثل /alice_data/:resourcekeymatch2_model.conf/keymatch2_policy.csv
keyMatch3مسار URL مثل /alice_data/resource1مسار URL أو نمط {} مثل /alice_data/{resource}https://github.com/casbin/casbin/blob/277c1a2b85698272f764d71a94d2595a8d425915/util/builtin_operators_test.go#L171-L196
keyMatch4مسار URL مثل /alice_data/123/book/123مسار URL أو نمط {} مثل /alice_data/{id}/book/{id}https://github.com/casbin/casbin/blob/277c1a2b85698272f764d71a94d2595a8d425915/util/builtin_operators_test.go#L208-L222
keyMatch5مسار URL مثل /alice_data/123/?status=1مسار URL أو نمط {} أو * مثل /alice_data/{id}/*https://github.com/casbin/casbin/blob/1cde2646d10ad1190c0d784c3a1c0e1ace1b5bc9/util/builtin_operators_test.go#L485-L526
regexMatchأي سلسلةنمط تعبير عاديkeymatch_model.conf/keymatch_policy.csv
ipMatchعنوان IP مثل 192.168.2.123عنوان IP أو CIDR مثل 192.168.2.0/24ipmatch_model.conf/ipmatch_policy.csv
globMatchمسار مثل /alice_data/resource1نمط glob مثل /alice_data/*https://github.com/casbin/casbin/blob/277c1a2b85698272f764d71a94d2595a8d425915/util/builtin_operators_test.go#L426-L466

بالنسبة للدوال الخاصة بالحصول على المفاتيح، فهي عادةً تأخذ ثلاث معاملات (باستثناء keyGet):

bool function_name(string url, string pattern, string key_name)

سوف تعيد قيمة المفتاح key_name إذا كان يطابق النمط، وتعيد "" إذا لم يتم مطابقة أي شيء.

على سبيل المثال، KeyGet2("/resource1/action", "/:res/action", "res") ستعيد "resource1"، وKeyGet3("/resource1_admin/action", "/{res}_admin/*", "res") ستعيد "resource1". دالة

urlpatternنمطkey_nameمثال
keyGetمسار URL مثل /proj/resource1مسار URL أو نمط * مثل /proj/*\keyget_model.conf/keymatch_policy.csv
keyGet2مسار URL مثل /proj/resource1مسار URL أو نمط : مثل /prooj/:resourceاسم المفتاح المحدد في النمطkeyget2_model.conf/keymatch2_policy.csv
keyGet3مسار URL مثل /proj/res3_admin/مسار URL أو نمط {} مثل /proj/{resource}_admin/*اسم المفتاح المحدد في النمطhttps://github.com/casbin/casbin/blob/7bd496f94f5a2739a392d333a9aaaa10ae397673/util/builtin_operators_test.go#L209-L247

انظر التفاصيل للوظائف أعلاه على: https://github.com/casbin/casbin/blob/master/util/builtin_operators_test.go

كيفية إضافة وظيفة مخصصة

أولاً، أعد وظيفتك. تأخذ عدة معاملات وتعيد قيمة منطقية:

func KeyMatch(key1 string, key2 string) bool {
i := strings.Index(key2, "*")
if i == -1 {
return key1 == key2
}

if len(key1) > i {
return key1[:i] == key2[:i]
}
return key1 == key2[:i]
}

ثم، قم بتغليفها بأنواع interface{}:

func KeyMatchFunc(args ...interface{}) (interface{}, error) {
name1 := args[0].(string)
name2 := args[1].(string)

return (bool)(KeyMatch(name1, name2)), nil
}

أخيرًا، سجل الوظيفة في مُنفذ Casbin:

e.AddFunction("my_func", KeyMatchFunc)

الآن، يمكنك استخدام الوظيفة في ملف CONF النموذجي الخاص بك كما يلي:

[matchers]
m = r.sub == p.sub && my_func(r.obj, p.obj) && r.act == p.act