Passer au contenu principal

Fonction

Fonctions dans les matchers

Vous pouvez même spécifier des fonctions dans un matcher pour le rendre plus puissant. Vous pouvez utiliser les fonctions intégrées ou spécifier votre propre fonction. 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.

Les fonctions intégrées supportées sont :

FonctionurlpatternExemple
keyMatchun chemin URL comme /alice_data/resource1un chemin URL ou un motif * comme /alice_data/*keymatch_model.conf/keymatch_policy.csv
format@@0 keyMatch2un chemin URL comme /alice_data/resource1un chemin URL ou un motif : comme /alice_data/:resourcekeymatch2_model.conf/keymatch2_policy.csv
format@@0 keyMatch3un chemin URL comme /alice_data/resource1un chemin URL ou un motif {} comme /alice_data/{resource}https://github.com/casbin/casbin/blob/277c1a2b85698272f764d71a94d2595a8d425915/util/builtin_operators_test.go#L171-L196
format@@0 keyMatch4un chemin URL comme /alice_data/123/book/123un chemin URL ou un motif {} comme /alice_data/{id}/book/{id}https://github.com/casbin/casbin/blob/277c1a2b85698272f764d71a94d2595a8d425915/util/builtin_operators_test.go#L208-L222
Correspondance regexetoute chaîne de caractèresun motif d'expression régulièrekeymatch_model.conf/keymatch_policy.csv
ipMatchune adresse IP comme 192.168.2.123une adresse IP ou un CIDR comme 192.168.2.0/24ipmatch_model.conf/ipmatch_policy.csv
globMatchun chemin semblable à un chemin comme /alice_data/resource1un modèle de glob comme /alice_data/*https://github.com/casbin/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

Voir les détails pour les fonctions ci-dessus à : https://github.com/casbin/casbin/blob/master/util/builtin_operators_test.go

Comment ajouter une fonction personnalisée

Préparez d'abord votre fonction. Il prend plusieurs paramètres et retourne un 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]
}

Ensuite enveloppez-le avec les types interface{}:

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

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

Enfin enregistrez la fonction auprès de l'agent de contrôle de Casbin:

e.AddFunction("my_func", KeyMatchFunc)

Maintenant, vous pouvez utiliser la fonction dans votre modèle CONF comme ceci :

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