Log & Error Handling
Registro
O Casbin usa o log
embutido para imprimir registros no console por padrão, como:
2017/07/15 19:43:56 [Request: alice, data1, read ---> true]
O registro não é ativado por padrão. Você pode ativá-lo por meio de Enforcer.EnableLog()
ou do último parâmetro de NewEnforcer()
.
Já suportamos o registro do modelo, solicitação de execução, papel e política em Golang. Você pode definir seu próprio registro para registrar o Casbin.
Se você está usando Python, o pycasbin utiliza o mecanismo de registro padrão do Python. O pacote pycasbin faz uma chamada para logging.getLogger()
para definir o registrador. Nenhuma configuração especial de registro é necessária, além de inicializar o registrador na aplicação pai. Se nenhum registro for inicializado dentro da aplicação pai, você não verá nenhuma mensagem de registro do pycasbin. Ao mesmo tempo, quando você ativa o registro no pycasbin, ele usará a configuração de registro padrão. Para outras extensões do pycasbin, você pode consultar a documentação de registro do Django se for um usuário do Django. Para outros usuários de Python, você deve consultar a documentação de registro do Python para configurar o registrador.
Use registradores diferentes para diferentes aplicadores
Cada aplicador pode ter seu próprio registrador para registrar informações, e ele pode ser alterado em tempo de execução.
E você pode usar um registrador adequado por meio do último parâmetro de NewEnforcer()
. Se você está usando essa maneira de inicializar seu aplicador, não precisa usar o parâmetro habilitado porque a prioridade do campo habilitado no registrador é maior.
// Set a default logger as enforcer e1's logger.
// This operation can also be seen as changing the logger of e1 at runtime.
e1.SetLogger(&Log.DefaultLogger{})
// Set another logger as enforcer e2's logger.
e2.SetLogger(&YouOwnLogger)
// Set your logger when initializing enforcer e3.
e3, _ := casbin.NewEnforcer("examples/rbac_model.conf", a, logger)
Registradores suportados
Fornecemos alguns registradores para ajudá-lo a registrar informações.
- Go
- PHP
Registrador | Autor | Descrição |
---|---|---|
Registrador padrão (embutido) | Casbin | O registrador padrão usando log do golang. |
Registrador Zap | Casbin | Usando zap, fornece registro codificado em json e você pode personalizar mais com seu próprio zap-logger. |
Registrador | Autor | Descrição |
---|---|---|
Registrador psr3-bridge | Casbin | Fornece uma ponte compatível com PSR-3. |
Como escrever um registrador
Seu registrador deve implementar a interface Logger.
Método | Tipo | Descrição |
---|---|---|
EnableLog() | obrigatório | Controla se a mensagem será impressa. |
IsEnabled() | obrigatório | Mostra o status habilitado do registrador atual. |
LogModel() | obrigatório | Registra informações relacionadas ao modelo. |
LogEnforce() | obrigatório | Informações de log relacionadas à aplicação. |
LogRole() | obrigatório | Informações de log relacionadas ao papel. |
LogPolicy() | obrigatório | Informações de log relacionadas à política. |
Você pode passar seu logger
personalizado para Enforcer.SetLogger()
.
Aqui está um exemplo de como personalizar um logger para Golang:
import (
"fmt"
"log"
"strings"
)
// DefaultLogger is the implementation for a Logger using golang log.
type DefaultLogger struct {
enabled bool
}
func (l *DefaultLogger) EnableLog(enable bool) {
l.enabled = enable
}
func (l *DefaultLogger) IsEnabled() bool {
return l.enabled
}
func (l *DefaultLogger) LogModel(model [][]string) {
if !l.enabled {
return
}
var str strings.Builder
str.WriteString("Model: ")
for _, v := range model {
str.WriteString(fmt.Sprintf("%v\n", v))
}
log.Println(str.String())
}
func (l *DefaultLogger) LogEnforce(matcher string, request []interface{}, result bool, explains [][]string) {
if !l.enabled {
return
}
var reqStr strings.Builder
reqStr.WriteString("Request: ")
for i, rval := range request {
if i != len(request)-1 {
reqStr.WriteString(fmt.Sprintf("%v, ", rval))
} else {
reqStr.WriteString(fmt.Sprintf("%v", rval))
}
}
reqStr.WriteString(fmt.Sprintf(" ---> %t\n", result))
reqStr.WriteString("Hit Policy: ")
for i, pval := range explains {
if i != len(explains)-1 {
reqStr.WriteString(fmt.Sprintf("%v, ", pval))
} else {
reqStr.WriteString(fmt.Sprintf("%v \n", pval))
}
}
log.Println(reqStr.String())
}
func (l *DefaultLogger) LogPolicy(policy map[string][][]string) {
if !l.enabled {
return
}
var str strings.Builder
str.WriteString("Policy: ")
for k, v := range policy {
str.WriteString(fmt.Sprintf("%s : %v\n", k, v))
}
log.Println(str.String())
}
func (l *DefaultLogger) LogRole(roles []string) {
if !l.enabled {
return
}
log.Println("Roles: ", roles)
}
Tratamento de erros
Erros ou panics podem ocorrer quando você usa o Casbin por motivos como:
- Sintaxe inválida no arquivo de modelo (.conf).
- Sintaxe inválida no arquivo de política (.csv).
- Erros personalizados de adaptadores de armazenamento, por exemplo, falha ao conectar com o MySQL.
- Bug do Casbin.
Há cinco funções principais das quais você pode precisar estar ciente para erros ou panics:
Função | Comportamento em caso de erro |
---|---|
NewEnforcer() | Retorna um erro |
LoadModel() | Retorna um erro |
LoadPolicy() | Retorna um erro |
SavePolicy() | Retorna um erro |
Enforce() | Retorna um erro |
NewEnforcer()
chama LoadModel()
e LoadPolicy()
internamente. Então você não precisa chamar os dois últimos ao usar NewEnforcer()
.
Habilitar e desabilitar
O enforcer pode ser desabilitado através da função Enforcer.EnableEnforce()
. Quando está desabilitado, Enforcer.Enforce()
sempre retornará true
. Outras operações como adicionar ou remover políticas não são afetadas. Aqui está um exemplo:
e := casbin.NewEnforcer("examples/basic_model.conf", "examples/basic_policy.csv")
// Will return false.
// By default, the enforcer is enabled.
e.Enforce("non-authorized-user", "data1", "read")
// Disable the enforcer at runtime.
e.EnableEnforce(false)
// Will return true for any request.
e.Enforce("non-authorized-user", "data1", "read")
// Enable the enforcer again.
e.EnableEnforce(true)
// Will return false.
e.Enforce("non-authorized-user", "data1", "read")