Passer au contenu principal

Functions

Fonctions dans les comparateurs

Vous pouvez même spécifier des fonctions dans un comparateur pour le rendre plus puissant. Vous pouvez utiliser des fonctions intégrées ou spécifier votre propre fonction. Les fonctions intégrées de correspondance de clés prennent le format suivant :

bool function_name(string url, string pattern)

Ils renvoient un booléen indiquant si l'url correspond au pattern.

Les fonctions intégrées prises en charge sont :

FonctionurlpatternExemple
keyMatchun chemin d'URL comme /alice_data/resource1un chemin d'URL ou un motif * comme /alice_data/*keymatch_model.conf/keymatch_policy.csv
keyMatch2un chemin d'URL comme /alice_data/resource1un chemin d'URL ou un motif : comme /alice_data/:resourcekeymatch2_model.conf/keymatch2_policy.csv
keyMatch3un chemin d'URL comme /alice_data/resource1un chemin d'URL ou un motif {} comme /alice_data/{resource}https://github.com/casbin/casbin/blob/277c1a2b85698272f764d71a94d2595a8d425915/util/builtin_operators_test.go#L171-L196
keyMatch4un chemin d'URL comme /alice_data/123/book/123un chemin d'URL ou un motif {} comme /alice_data/{id}/book/{id}https://github.com/casbin/casbin/blob/277c1a2b85698272f764d71a94d2595a8d425915/util/builtin_operators_test.go#L208-L222
keyMatch5un chemin d'URL comme /alice_data/123/?status=1un chemin d'URL, un motif {} ou * comme /alice_data/{id}/*https://github.com/casbin/casbin/blob/1cde2646d10ad1190c0d784c3a1c0e1ace1b5bc9/util/builtin_operators_test.go#L485-L526
regexMatchn'importe quelle chaîneun 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 de type path comme /alice_data/resource1un motif glob comme /alice_data/*https://github.com/casbin/casbin/blob/277c1a2b85698272f764d71a94d2595a8d425915/util/builtin_operators_test.go#L426-L466

Pour les fonctions d'obtention de clé, elles prennent généralement trois paramètres (sauf keyGet) :

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

Elles renverront la valeur de la clé key_name si elle correspond au motif, et renverront "" si rien ne correspond.

Par exemple, KeyGet2("/resource1/action", "/:res/action", "res") renverra "resource1", et KeyGet3("/resource1_admin/action", "/{res}_admin/*", "res") renverra "resource1". Quant à KeyGet, qui prend deux paramètres, KeyGet("/resource1/action", "/*) renverra "resource1/action".

Fonctionurlmotifkey_nameexemple
keyGetun chemin URL comme /proj/resource1un chemin URL ou un motif * comme /proj/*\keyget_model.conf/keymatch_policy.csv
keyGet2un chemin URL comme /proj/resource1un chemin URL ou un motif : comme /prooj/:resourcenom de clé spécifié dans le motifkeyget2_model.conf/keymatch2_policy.csv
keyGet3un chemin d'URL comme /proj/res3_admin/un chemin d'URL ou un motif {} comme /proj/{resource}_admin/*nom de clé spécifié dans le motifhttps://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

D'abord, préparez votre fonction. Elle prend plusieurs paramètres et renvoie un booléen :

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-la avec des 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 dans l'exécuteur 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