Zum Hauptinhalt springen

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:

FunktionurlpatternBeispiel
keyMatchein URL-Pfad wie /alice_data/resource1ein URL-Pfad oder ein * Muster wie /alice_data/*keymatch_model.conf/keymatch_policy.csv
keyMatch2ein URL-Pfad wie /alice_data/resource1ein URL-Pfad oder ein : Muster wie /alice_data/:resourcekeymatch2_model.conf/keymatch2_policy.csv
keyMatch3ein URL-Pfad wie /alice_data/resource1ein URL-Pfad oder ein {} Muster wie /alice_data/{resource}https://github.com/casbin/casbin/blob/277c1a2b85698272f764d71a94d2595a8d425915/util/builtin_operators_test.go#L171-L196
keyMatch4ein URL-Pfad wie /alice_data/123/book/123ein 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
keyMatch5ein URL-Pfad wie /alice_data/123/?status=1ein URL-Pfad, ein {} oder * Muster wie /alice_data/{id}/*https://github.com/casbin/casbin/blob/1cde2646d10ad1190c0d784c3a1c0e1ace1b5bc9/util/builtin_operators_test.go#L485-L526
regexMatchbeliebiger Stringein reguläres Ausdrucksmusterkeymatch_model.conf/keymatch_policy.csv
ipMatcheine IP-Adresse wie 192.168.2.123eine IP-Adresse oder ein CIDR wie 192.168.2.0/24ipmatch_model.conf/ipmatch_policy.csv
globMatchein pfadähnlicher Pfad wie /alice_data/resource1ein 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.

FunktionurlMusterkey_nameBeispiel
keyGetein URL-Pfad wie /proj/resource1ein URL-Pfad oder ein * Muster wie /proj/*\keyget_model.conf/keymatch_policy.csv
keyGet2ein URL-Pfad wie /proj/resource1ein URL-Pfad oder : Muster wie /prooj/:resourceSchlüsselname, der im Muster angegeben istkeyget2_model.conf/keymatch2_policy.csv
keyGet3ein URL-Pfad wie /proj/res3_admin/ein URL-Pfad oder {} Muster wie /proj/{resource}_admin/*Schlüsselname, der im Muster angegeben isthttps://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