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 :
Fonction | url | pattern | Exemple |
---|---|---|---|
keyMatch | un chemin d'URL comme /alice_data/resource1 | un chemin d'URL ou un motif * comme /alice_data/* | keymatch_model.conf/keymatch_policy.csv |
keyMatch2 | un chemin d'URL comme /alice_data/resource1 | un chemin d'URL ou un motif : comme /alice_data/:resource | keymatch2_model.conf/keymatch2_policy.csv |
keyMatch3 | un chemin d'URL comme /alice_data/resource1 | un chemin d'URL ou un motif {} comme /alice_data/{resource} | https://github.com/casbin/casbin/blob/277c1a2b85698272f764d71a94d2595a8d425915/util/builtin_operators_test.go#L171-L196 |
keyMatch4 | un chemin d'URL comme /alice_data/123/book/123 | un 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 |
keyMatch5 | un chemin d'URL comme /alice_data/123/?status=1 | un chemin d'URL, un motif {} ou * comme /alice_data/{id}/* | https://github.com/casbin/casbin/blob/1cde2646d10ad1190c0d784c3a1c0e1ace1b5bc9/util/builtin_operators_test.go#L485-L526 |
regexMatch | n'importe quelle chaîne | un motif d'expression régulière | keymatch_model.conf/keymatch_policy.csv |
ipMatch | une adresse IP comme 192.168.2.123 | une adresse IP ou un CIDR comme 192.168.2.0/24 | ipmatch_model.conf/ipmatch_policy.csv |
globMatch | un chemin de type path comme /alice_data/resource1 | un 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"
.
Fonction | url | motif | key_name | exemple |
---|---|---|---|---|
keyGet | un chemin URL comme /proj/resource1 | un chemin URL ou un motif * comme /proj/* | \ | keyget_model.conf/keymatch_policy.csv |
keyGet2 | un chemin URL comme /proj/resource1 | un chemin URL ou un motif : comme /prooj/:resource | nom de clé spécifié dans le motif | keyget2_model.conf/keymatch2_policy.csv |
keyGet3 | un 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 motif | https://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