Functions
Funções em comparadores
Você pode até especificar funções em um comparador para torná-lo mais poderoso. Você pode usar funções integradas ou especificar sua própria função. As funções integradas de correspondência de chaves seguem o seguinte formato:
bool function_name(string url, string pattern)
Elas retornam um booleano indicando se a url
corresponde ao padrão
.
As funções integradas suportadas são:
Função | url | padrão | Exemplo |
---|---|---|---|
keyMatch | um caminho de URL como /alice_data/resource1 | um caminho de URL ou um padrão * como /alice_data/* | keymatch_model.conf/keymatch_policy.csv |
keyMatch2 | um caminho de URL como /alice_data/resource1 | um caminho de URL ou um padrão : como /alice_data/:resource | keymatch2_model.conf/keymatch2_policy.csv |
keyMatch3 | um caminho de URL como /alice_data/resource1 | um caminho de URL ou um padrão {} como /alice_data/{resource} | https://github.com/casbin/casbin/blob/277c1a2b85698272f764d71a94d2595a8d425915/util/builtin_operators_test.go#L171-L196 |
keyMatch4 | um caminho de URL como /alice_data/123/book/123 | um caminho de URL ou um padrão {} como /alice_data/{id}/book/{id} | https://github.com/casbin/casbin/blob/277c1a2b85698272f764d71a94d2595a8d425915/util/builtin_operators_test.go#L208-L222 |
keyMatch5 | um caminho de URL como /alice_data/123/?status=1 | um caminho de URL, um padrão {} ou * como /alice_data/{id}/* | https://github.com/casbin/casbin/blob/1cde2646d10ad1190c0d784c3a1c0e1ace1b5bc9/util/builtin_operators_test.go#L485-L526 |
regexMatch | qualquer string | um padrão de expressão regular | keymatch_model.conf/keymatch_policy.csv |
ipMatch | um endereço IP como 192.168.2.123 | um endereço IP ou um CIDR como 192.168.2.0/24 | ipmatch_model.conf/ipmatch_policy.csv |
globMatch | um caminho semelhante a um caminho como /alice_data/resource1 | um padrão glob como /alice_data/* | https://github.com/casbin/casbin/blob/277c1a2b85698272f764d71a94d2595a8d425915/util/builtin_operators_test.go#L426-L466 |
Para funções de obtenção de chaves, elas geralmente tomam três parâmetros (exceto keyGet
):
bool function_name(string url, string pattern, string key_name)
Elas retornarão o valor da chave key_name
se ela corresponder ao padrão, e retornarão ""
se nada corresponder.
Por exemplo, KeyGet2("/resource1/action", "/:res/action", "res")
retornará "resource1"
, e KeyGet3("/resource1_admin/action", "/{res}_admin/*", "res")
retornará "resource1"
.
Quanto ao KeyGet
, que leva dois parâmetros, KeyGet("/resource1/action", "/*)
retornará "resource1/action"
.
Função | url | padrão | key_name | exemplo |
---|---|---|---|---|
keyGet | um caminho de URL como /proj/resource1 | um caminho de URL ou um padrão * como /proj/* | \ | keyget_model.conf/keymatch_policy.csv |
keyGet2 | um caminho de URL como /proj/resource1 | um caminho de URL ou padrão : como /prooj/:resource | nome da chave especificado no padrão | keyget2_model.conf/keymatch2_policy.csv |
keyGet3 | um caminho de URL como /proj/res3_admin/ | um caminho de URL ou padrão {} como /proj/{resource}_admin/* | nome da chave especificado no padrão | https://github.com/casbin/casbin/blob/7bd496f94f5a2739a392d333a9aaaa10ae397673/util/builtin_operators_test.go#L209-L247 |
Veja detalhes para as funções acima em: https://github.com/casbin/casbin/blob/master/util/builtin_operators_test.go
Como adicionar uma função personalizada
Primeiro, prepare sua função. Ela recebe vários parâmetros e retorna um 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]
}
Então, envolva-a com tipos interface{}
:
func KeyMatchFunc(args ...interface{}) (interface{}, error) {
name1 := args[0].(string)
name2 := args[1].(string)
return (bool)(KeyMatch(name1, name2)), nil
}
Finalmente, registre a função no enforcer do Casbin:
e.AddFunction("my_func", KeyMatchFunc)
Agora, você pode usar a função em seu modelo CONF assim:
[matchers]
m = r.sub == p.sub && my_func(r.obj, p.obj) && r.act == p.act