Functions
Funciones en comparadores
Incluso puedes especificar funciones en un comparador para hacerlo más poderoso. Puedes usar funciones integradas o especificar tu propia función. Las funciones integradas de coincidencia de claves toman el siguiente formato:
bool function_name(string url, string pattern)
Devuelven un booleano indicando si la url
coincide con el patrón
.
Las funciones integradas soportadas son:
Función | url | patrón | Ejemplo |
---|---|---|---|
keyMatch | una ruta de URL como /alice_data/resource1 | una ruta de URL o un patrón * como /alice_data/* | keymatch_model.conf/keymatch_policy.csv |
keyMatch2 | una ruta de URL como /alice_data/resource1 | una ruta de URL o un patrón : como /alice_data/:resource | keymatch2_model.conf/keymatch2_policy.csv |
keyMatch3 | una ruta de URL como /alice_data/resource1 | una ruta de URL o un patrón {} como /alice_data/{resource} | https://github.com/casbin/casbin/blob/277c1a2b85698272f764d71a94d2595a8d425915/util/builtin_operators_test.go#L171-L196 |
keyMatch4 | una ruta de URL como /alice_data/123/book/123 | una ruta de URL o un patrón {} como /alice_data/{id}/book/{id} | https://github.com/casbin/casbin/blob/277c1a2b85698272f764d71a94d2595a8d425915/util/builtin_operators_test.go#L208-L222 |
keyMatch5 | una ruta de URL como /alice_data/123/?status=1 | una ruta de URL, un patrón {} o * como /alice_data/{id}/* | https://github.com/casbin/casbin/blob/1cde2646d10ad1190c0d784c3a1c0e1ace1b5bc9/util/builtin_operators_test.go#L485-L526 |
regexMatch | cualquier cadena | un patrón de expresión regular | keymatch_model.conf/keymatch_policy.csv |
ipMatch | una dirección IP como 192.168.2.123 | una dirección IP o un CIDR como 192.168.2.0/24 | ipmatch_model.conf/ipmatch_policy.csv |
globMatch | una ruta similar a un path como /alice_data/resource1 | un patrón glob como /alice_data/* | https://github.com/casbin/casbin/blob/277c1a2b85698272f764d71a94d2595a8d425915/util/builtin_operators_test.go#L426-L466 |
Para las funciones de obtención de claves, generalmente toman tres parámetros (excepto keyGet
):
bool function_name(string url, string pattern, string key_name)
Devolverán el valor de la clave key_name
si coincide con el patrón, y devolverán ""
si no hay coincidencia.
Por ejemplo, KeyGet2("/resource1/action", "/:res/action", "res")
devolverá "resource1"
, y KeyGet3("/resource1_admin/action", "/{res}_admin/*", "res")
devolverá "resource1"
.
En cuanto a KeyGet
, que toma dos parámetros, KeyGet("/resource1/action", "/*")
devolverá "resource1/action"
.
Función | url | patrón | key_name | ejemplo |
---|---|---|---|---|
keyGet | una ruta de URL como /proj/resource1 | una ruta de URL o un patrón * como /proj/* | \ | keyget_model.conf/keymatch_policy.csv |
keyGet2 | una ruta de URL como /proj/resource1 | una ruta de URL o patrón : como /prooj/:resource | nombre de clave especificado en el patrón | keyget2_model.conf/keymatch2_policy.csv |
keyGet3 | una ruta de URL como /proj/res3_admin/ | una ruta de URL o patrón {} como /proj/{resource}_admin/* | nombre de clave especificado en el patrón | https://github.com/casbin/casbin/blob/7bd496f94f5a2739a392d333a9aaaa10ae397673/util/builtin_operators_test.go#L209-L247 |
Vea los detalles de las funciones anteriores en: https://github.com/casbin/casbin/blob/master/util/builtin_operators_test.go
Cómo agregar una función personalizada
Primero, prepara tu función. Toma varios parámetros y devuelve 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]
}
Luego, envuélvela con tipos interface{}
:
func KeyMatchFunc(args ...interface{}) (interface{}, error) {
name1 := args[0].(string)
name2 := args[1].(string)
return (bool)(KeyMatch(name1, name2)), nil
}
Finalmente, registra la función en el enforcer de Casbin:
e.AddFunction("my_func", KeyMatchFunc)
Ahora, puedes usar la función en tu modelo CONF de esta manera:
[matchers]
m = r.sub == p.sub && my_func(r.obj, p.obj) && r.act == p.act