Lewati ke konten utama

Functions

Fungsi dalam pencocok

Anda bahkan dapat menentukan fungsi dalam pencocok untuk membuatnya lebih kuat. Anda dapat menggunakan fungsi bawaan atau menentukan fungsi Anda sendiri. Fungsi pencocokan kunci bawaan mengikuti format berikut:

bool function_name(string url, string pattern)

Mereka mengembalikan nilai boolean yang menunjukkan apakah url cocok dengan pola.

Fungsi bawaan yang didukung adalah:

FungsiurlpolaContoh
keyMatchjalur URL seperti /alice_data/resource1jalur URL atau pola * seperti /alice_data/*keymatch_model.conf/keymatch_policy.csv
keyMatch2jalur URL seperti /alice_data/resource1jalur URL atau pola : seperti /alice_data/:resourcekeymatch2_model.conf/keymatch2_policy.csv
keyMatch3jalur URL seperti /alice_data/resource1jalur URL atau pola {} seperti /alice_data/{resource}https://github.com/casbin/casbin/blob/277c1a2b85698272f764d71a94d2595a8d425915/util/builtin_operators_test.go#L171-L196
keyMatch4jalur URL seperti /alice_data/123/book/123jalur URL atau pola {} seperti /alice_data/{id}/book/{id}https://github.com/casbin/casbin/blob/277c1a2b85698272f764d71a94d2595a8d425915/util/builtin_operators_test.go#L208-L222
keyMatch5jalur URL seperti /alice_data/123/?status=1jalur URL, pola {} atau * seperti /alice_data/{id}/*https://github.com/casbin/casbin/blob/1cde2646d10ad1190c0d784c3a1c0e1ace1b5bc9/util/builtin_operators_test.go#L485-L526
regexMatchstring apa sajapola ekspresi regulerkeymatch_model.conf/keymatch_policy.csv
ipMatchalamat IP seperti 192.168.2.123alamat IP atau CIDR seperti 192.168.2.0/24ipmatch_model.conf/ipmatch_policy.csv
globMatchjalur seperti jalur /alice_data/resource1pola glob seperti /alice_data/*https://github.com/casbin/casbin/blob/277c1a2b85698272f764d71a94d2595a8d425915/util/builtin_operators_test.go#L426-L466

Untuk fungsi-fungsi mendapatkan kunci, biasanya mereka mengambil tiga parameter (kecuali keyGet):

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

Mereka akan mengembalikan nilai dari kunci key_name jika cocok dengan pola, dan mengembalikan "" jika tidak ada yang cocok.

Misalnya, KeyGet2("/resource1/action", "/:res/action", "res") akan mengembalikan "resource1", dan KeyGet3("/resource1_admin/action", "/{res}_admin/*", "res") akan mengembalikan "resource1". Sebagai untuk KeyGet, yang mengambil dua parameter, KeyGet("/resource1/action", "/*) akan mengembalikan "resource1/action".

Fungsiurlpolakey_namecontoh
keyGetjalur URL seperti /proj/resource1jalur URL atau pola * seperti /proj/*\keyget_model.conf/keymatch_policy.csv
keyGet2jalur URL seperti /proj/resource1jalur URL atau pola : seperti /prooj/:resourcenama kunci yang ditentukan dalam polakeyget2_model.conf/keymatch2_policy.csv
keyGet3sebuah jalur URL seperti /proj/res3_admin/sebuah jalur URL atau pola {} seperti /proj/{resource}_admin/*nama kunci yang ditentukan dalam polahttps://github.com/casbin/casbin/blob/7bd496f94f5a2739a392d333a9aaaa10ae397673/util/builtin_operators_test.go#L209-L247

Lihat detail untuk fungsi-fungsi di atas di: https://github.com/casbin/casbin/blob/master/util/builtin_operators_test.go

Cara menambahkan fungsi kustom

Pertama, siapkan fungsi Anda. Fungsi ini mengambil beberapa parameter dan mengembalikan nilai bool:

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]
}

Kemudian, bungkus dengan tipe interface{}:

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

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

Terakhir, daftarkan fungsi tersebut ke enforcer Casbin:

e.AddFunction("my_func", KeyMatchFunc)

Sekarang, Anda dapat menggunakan fungsi tersebut dalam model CONF Anda seperti ini:

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