Zum Hauptinhalt springen

Funktion

Funktionen in Matchern

Sie können sogar Funktionen in einem Matcher angeben, um diese mächtiger zu machen. Sie können die eingebauten Funktionen verwenden oder Ihre eigene Funktion angeben. The built-in key-matching functions take such a format:

bool function_name(string url, string pattern)

It returns a boolean indicating whether url matches pattern.

Die unterstützten 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/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://de.github.com/casbin/blob/277c1a2b85698272f764d71a94d2595a8d425915/util/builtin_operators_test.go#L208-L222
regexMatchjede Zeichenketteein Muster für reguläre Ausdrückekeymatch_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/blob/277c1a2b85698272f764d71a94d2595a8d425915/util/builtin_operators_test.go#L426-L466

For key-getting functions, they usually take three parameters(except keyGet):

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

They will return the value of the key key_name if it matches the pattern, and return "" if nothing is matched.

For example, KeyGet2("/resource1/action", "/:res/action, "res") will return "resource1", KeyGet3("/resource1_admin/action", "/{res}_admin/*", "res") will return "resource1". As for KeyGet, which takes two parameters, KeyGet("/resource1/action", "/*) will return "resource1/action".

Functionurlpatternkey_nameexample
keyGeta URL path like /proj/resource1a URL path or a * pattern like /proj/*\ keyget_model.conf/keymatch_policy.csv
keyGet2a URL path like /proj/resource1a URL path or : pattern like /prooj/:resourcekey name specified in the patternkeyget2_model.conf/keymatch2_policy.csv
keyGet3a URL path like /proj/res3_admin/a URL path or {} pattern like /proj/{resource}_admin/*key name specified in the patternhttps://github.com/casbin/casbin/blob/7bd496f94f5a2739a392d333a9aaaa10ae397673/util/builtin_operators_test.go#L209-L247

Details zu obigen Funktionen finden Sie unter: https://github.com/casbin/casbin/blob/master/util/builtin_operators_test.go

So fügen Sie eine benutzerdefinierte Funktion hinzu

Bereiten Sie zuerst Ihre Funktion vor. Es benötigt 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 wickeln Sie es mit Schnittstelle{} Typen:

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

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

Endlich registrieren Sie die Funktion beim Casbin Enforcer:

e.AddFunction("my_func", KeyMatchFunc)

Jetzt können Sie die Funktion in Ihrem Modell CONF wie folgt verwenden:

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