Langkau ke kandungan utama

Functions

Fungsi dalam penapis

Anda juga boleh menentukan fungsi dalam penapis untuk menjadikannya lebih berkuasa. Anda boleh menggunakan fungsi terbina dalam atau menentukan fungsi anda sendiri. Fungsi padanan kunci terbina dalam mengambil format berikut:

bool function_name(string url, string pattern)

Mereka mengembalikan nilai boolean yang menunjukkan sama ada url sepadan dengan corak.

Fungsi terbina dalam yang disokong adalah:

FungsiurlcorakContoh
keyMatchlaluan URL seperti /alice_data/resource1laluan URL atau corak * seperti /alice_data/*keymatch_model.conf/keymatch_policy.csv
keyMatch2laluan URL seperti /alice_data/resource1laluan URL atau corak : seperti /alice_data/:resourcekeymatch2_model.conf/keymatch2_policy.csv
keyMatch3laluan URL seperti /alice_data/resource1laluan URL atau corak {} seperti /alice_data/{resource}https://github.com/casbin/casbin/blob/277c1a2b85698272f764d71a94d2595a8d425915/util/builtin_operators_test.go#L171-L196
keyMatch4laluan URL seperti /alice_data/123/book/123laluan URL atau corak {} seperti /alice_data/{id}/book/{id}https://github.com/casbin/casbin/blob/277c1a2b85698272f764d71a94d2595a8d425915/util/builtin_operators_test.go#L208-L222
keyMatch5laluan URL seperti /alice_data/123/?status=1laluan URL, corak {} atau * seperti /alice_data/{id}/*https://github.com/casbin/casbin/blob/1cde2646d10ad1190c0d784c3a1c0e1ace1b5bc9/util/builtin_operators_test.go#L485-L526
regexMatchsebarang rentetancorak ekspresi biasakeymatch_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
globMatchlaluan seperti laluan /alice_data/resource1corak glob seperti /alice_data/*https://github.com/casbin/casbin/blob/277c1a2b85698272f764d71a94d2595a8d425915/util/builtin_operators_test.go#L426-L466

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

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

Mereka akan mengembalikan nilai kunci key_name jika ia sepadan dengan corak, dan mengembalikan "" jika tiada yang sepadan.

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

Fungsiurlcorakkey_namecontoh
keyGetlaluan URL seperti /proj/resource1laluan URL atau corak * seperti /proj/*\keyget_model.conf/keymatch_policy.csv
keyGet2laluan URL seperti /proj/resource1laluan URL atau corak : seperti /prooj/:resourcenama kunci yang ditentukan dalam corakkeyget2_model.conf/keymatch2_policy.csv
keyGet3laluan URL seperti /proj/res3_admin/laluan URL atau corak {} seperti /proj/{resource}_admin/*nama kunci yang ditentukan dalam corakhttps://github.com/casbin/casbin/blob/7bd496f94f5a2739a392d333a9aaaa10ae397673/util/builtin_operators_test.go#L209-L247

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

Cara menambah fungsi yang disesuaikan

Pertama, sediakan fungsi anda. Ia mengambil beberapa parameter dan mengembalikan 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, bungkusnya dengan jenis interface{}:

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

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

Akhirnya, daftarkan fungsi tersebut ke enforcer Casbin:

e.AddFunction("my_func", KeyMatchFunc)

Sekarang, anda boleh 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