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. Toutes les fonctions intégrées prennent un tel format (sauf keyGet
et keyGet2
) :
bool function_name(chaîne arg1, chaîne arg2)
Il retourne si arg1
correspond à arg2
.
keyGet
et keyGet2
retourneront la chaîne qui correspond à la carte joker et retourneront ""
si rien ne correspondait.
Les fonctions intégrées supportées sont :
Fonction | arg1 | arg2 | Exemple |
---|---|---|---|
keyMatch | un chemin URL comme /alice_data/resource1 | un chemin URL ou un motif * comme /alice_data/* | keymatch_model.conf/keymatch_policy.csv |
keyGet | un chemin URL comme /alice_data/resource1 | un chemin URL ou un motif * comme /alice_data/* | keyget_model.conf/keymatch_policy.csv |
format@@0 keyMatch2 | un chemin URL comme /alice_data/resource1 | un chemin URL ou un motif : comme /alice_data/:resource | keymatch2_model.conf/keymatch2_policy.csv |
keyGet2 | un chemin URL comme /alice_data/resource1 | un chemin d'URL ou : modèle comme /alice_data/:resource | keyget2_model.conf/keymatch2_policy.csv |
format@@0 keyMatch3 | un chemin URL comme /alice_data/resource1 | un 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 keyMatch4 | un chemin URL comme /alice_data/123/book/123 | un 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 regexe | toute chaîne de caractères | 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 semblable à un chemin comme /alice_data/resource1 | un modèle de glob comme /alice_data/* | https://github.com/casbin/casbin/blob/277c1a2b85698272f764d71a94d2595a8d425915/util/builtin_operators_test.go#L426-L466 |
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. ndex(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