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:
Fungsi | url | corak | Contoh |
---|---|---|---|
keyMatch | laluan URL seperti /alice_data/resource1 | laluan URL atau corak * seperti /alice_data/* | keymatch_model.conf/keymatch_policy.csv |
keyMatch2 | laluan URL seperti /alice_data/resource1 | laluan URL atau corak : seperti /alice_data/:resource | keymatch2_model.conf/keymatch2_policy.csv |
keyMatch3 | laluan URL seperti /alice_data/resource1 | laluan URL atau corak {} seperti /alice_data/{resource} | https://github.com/casbin/casbin/blob/277c1a2b85698272f764d71a94d2595a8d425915/util/builtin_operators_test.go#L171-L196 |
keyMatch4 | laluan URL seperti /alice_data/123/book/123 | laluan URL atau corak {} seperti /alice_data/{id}/book/{id} | https://github.com/casbin/casbin/blob/277c1a2b85698272f764d71a94d2595a8d425915/util/builtin_operators_test.go#L208-L222 |
keyMatch5 | laluan URL seperti /alice_data/123/?status=1 | laluan URL, corak {} atau * seperti /alice_data/{id}/* | https://github.com/casbin/casbin/blob/1cde2646d10ad1190c0d784c3a1c0e1ace1b5bc9/util/builtin_operators_test.go#L485-L526 |
regexMatch | sebarang rentetan | corak ekspresi biasa | keymatch_model.conf/keymatch_policy.csv |
ipMatch | alamat IP seperti 192.168.2.123 | alamat IP atau CIDR seperti 192.168.2.0/24 | ipmatch_model.conf/ipmatch_policy.csv |
globMatch | laluan seperti laluan /alice_data/resource1 | corak 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"
.
Fungsi | url | corak | key_name | contoh |
---|---|---|---|---|
keyGet | laluan URL seperti /proj/resource1 | laluan URL atau corak * seperti /proj/* | \ | keyget_model.conf/keymatch_policy.csv |
keyGet2 | laluan URL seperti /proj/resource1 | laluan URL atau corak : seperti /prooj/:resource | nama kunci yang ditentukan dalam corak | keyget2_model.conf/keymatch2_policy.csv |
keyGet3 | laluan URL seperti /proj/res3_admin/ | laluan URL atau corak {} seperti /proj/{resource}_admin/* | nama kunci yang ditentukan dalam corak | https://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