Functions
Funktionen in Übereinstimmungen
Sie können sogar Funktionen in einem Matcher angeben, um ihn leistungsfähiger zu machen. Sie können integrierte Funktionen verwenden oder Ihre eigene Funktion festlegen. Die integrierten Schlüsselübereinstimmungsfunktionen haben das folgende Format:
bool function_name(string url, string pattern)
Sie geben einen booleschen Wert zurück, der angibt, ob die url
dem pattern
entspricht.
Die unterstützten integrierten Funktionen sind:
Funktion | url | pattern | Beispiel |
---|---|---|---|
keyMatch | ein URL-Pfad wie /alice_data/resource1 | ein URL-Pfad oder ein * Muster wie /alice_data/* | keymatch_model.conf/keymatch_policy.csv |
keyMatch2 | ein URL-Pfad wie /alice_data/resource1 | ein URL-Pfad oder ein : Muster wie /alice_data/:resource | keymatch2_model.conf/keymatch2_policy.csv |
keyMatch3 | ein URL-Pfad wie /alice_data/resource1 | ein URL-Pfad oder ein {} Muster wie /alice_data/{resource} | https://github.com/casbin/casbin/blob/277c1a2b85698272f764d71a94d2595a8d425915/util/builtin_operators_test.go#L171-L196 |
keyMatch4 | ein URL-Pfad wie /alice_data/123/book/123 | ein URL-Pfad oder ein {} Muster wie /alice_data/{id}/book/{id} | https://github.com/casbin/casbin/blob/277c1a2b85698272f764d71a94d2595a8d425915/util/builtin_operators_test.go#L208-L222 |
keyMatch5 | ein URL-Pfad wie /alice_data/123/?status=1 | ein URL-Pfad, ein {} oder * Muster wie /alice_data/{id}/* | https://github.com/casbin/casbin/blob/1cde2646d10ad1190c0d784c3a1c0e1ace1b5bc9/util/builtin_operators_test.go#L485-L526 |
regexMatch | beliebiger String | ein reguläres Ausdrucksmuster | keymatch_model.conf/keymatch_policy.csv |
ipMatch | eine IP-Adresse wie 192.168.2.123 | eine IP-Adresse oder ein CIDR wie 192.168.2.0/24 | ipmatch_model.conf/ipmatch_policy.csv |
globMatch | ein pfadähnlicher Pfad wie /alice_data/resource1 | ein glob-Muster wie /alice_data/* | https://github.com/casbin/casbin/blob/277c1a2b85698272f764d71a94d2595a8d425915/util/builtin_operators_test.go#L426-L466 |
Für Schlüsselabruffunktionen nehmen sie normalerweise drei Parameter (außer keyGet
):
bool function_name(string url, string pattern, string key_name)
Sie geben den Wert des Schlüssels key_name
zurück, wenn er mit dem Muster übereinstimmt, und geben ""
zurück, wenn nichts übereinstimmt.
Zum Beispiel wird KeyGet2("/resource1/action", "/:res/action", "res")
"resource1" zurückgeben, und KeyGet3("/resource1_admin/action", "/{res}_admin/*", "res")
wird "resource1" zurückgeben.
Was KeyGet
betrifft, das zwei Parameter nimmt, KeyGet("/resource1/action", "/*)
wird "resource1/action" zurückgeben.
Funktion | url | Muster | key_name | Beispiel |
---|---|---|---|---|
keyGet | ein URL-Pfad wie /proj/resource1 | ein URL-Pfad oder ein * Muster wie /proj/* | \ | keyget_model.conf/keymatch_policy.csv |
keyGet2 | ein URL-Pfad wie /proj/resource1 | ein URL-Pfad oder : Muster wie /prooj/:resource | Schlüsselname, der im Muster angegeben ist | keyget2_model.conf/keymatch2_policy.csv |
keyGet3 | ein URL-Pfad wie /proj/res3_admin/ | ein URL-Pfad oder {} Muster wie /proj/{resource}_admin/* | Schlüsselname, der im Muster angegeben ist | https://github.com/casbin/casbin/blob/7bd496f94f5a2739a392d333a9aaaa10ae397673/util/builtin_operators_test.go#L209-L247 |
Siehe Details zu den obigen Funktionen unter: https://github.com/casbin/casbin/blob/master/util/builtin_operators_test.go
Wie man eine benutzerdefinierte Funktion hinzufügt
Zuerst, bereiten Sie Ihre Funktion vor. Es nimmt mehrere Parameter und gibt einen bool zurück:
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]
}
Dann, verpacken Sie es mit interface{}
Typen:
func KeyMatchFunc(args ...interface{}) (interface{}, error) {
name1 := args[0].(string)
name2 := args[1].(string)
return (bool)(KeyMatch(name1, name2)), nil
}
Schließlich, registrieren Sie die Funktion beim Casbin Enforcer:
e.AddFunction("my_func", KeyMatchFunc)
Jetzt können Sie die Funktion in Ihrer Modell CONF wie folgt verwenden:
[matchers]
m = r.sub == p.sub && my_func(r.obj, p.obj) && r.act == p.act