Перейти к основному содержимому

Logging & Error Handling

Logging​

Casbin может вести журнал запросов, загрузки модели и изменений политик. Ведение журнала по умолчанию отключено. Включите его с помощью Enforcer.EnableLog() или через параметр логгера в NewEnforcer(). Пример вывода:

2017/07/15 19:43:56 [Request: alice, data1, read ---> true]
примечание

Go: Вы можете подключить собственный логгер; Casbin выводит модели, запросы, роли и политики через него.

примечание

Python: PyCasbin использует стандартный модуль logging. Настройте ведение журнала вашего приложения обычным способом; PyCasbin использует logging.getLogger(). Необязательный logging_config описан в pycasbin/util/log.py. См. Python logging и Django logging для настройки.

Настройка отдельных логгеров для разных энфорсеров​

Каждый энфорсер может иметь свой собственный логгер, и логгеры можно менять во время выполнения.

Вы можете указать логгер, используя последний параметр NewEnforcer(). При использовании этого метода поле enabled логгера имеет приоритет над параметром enabled энфорсера.

// 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)

Поддерживаемые логгеры​

Casbin предоставляет несколько реализаций логгеров:

ЛоггерАвторОписание
Логгер по умолчанию (встроенный)CasbinЛоггер по умолчанию, использующий стандартный пакет log Go.
Zap loggerCasbinИспользует zap для логов в формате JSON с дополнительными вариантами настройки через zap-logger.

Реализация собственных логгеров​

Пользовательские логгеры должны реализовывать интерфейс Logger.

МетодТипОписание
EnableLog()обязательныйУправляет выводом сообщений.
IsEnabled()обязательныйВозвращает текущий статус включенности логгера.
LogModel()обязательныйВыводит информацию, связанную с моделью.
LogEnforce()обязательныйВыводит информацию, связанную с проверкой доступа.
LogRole()обязательныйВыводит информацию, связанную с ролями.
LogPolicy()обязательныйВыводит информацию, связанную с политиками.

Передайте ваш пользовательский логгер в Enforcer.SetLogger().

Пример реализации пользовательского логгера на Go:

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)
}

Обработка ошибок​

Ошибки или паники могут возникать в Casbin по нескольким причинам:

  1. Недопустимый синтаксис в файле модели (.conf)
  2. Недопустимый синтаксис в файле политики (.csv)
  3. Пользовательские ошибки от адаптеров хранилища (например, сбои подключения к MySQL)
  4. Casbin bugs

Пять основных функций могут вызывать ошибки или панику:

ФункцияПоведение при ошибке
NewEnforcer()Возвращает ошибку
LoadModel()Возвращает ошибку
LoadPolicy()Возвращает ошибку
SavePolicy()Возвращает ошибку
Enforce()Возвращает ошибку
примечание

NewEnforcer() внутренне вызывает как LoadModel(), так и LoadPolicy(), поэтому вам не нужно вызывать их отдельно при использовании NewEnforcer().

Включение и отключение принудительного контроля доступа​

Вы можете отключить enforcer с помощью Enforcer.EnableEnforce(). Когда он отключен, Enforcer.Enforce() всегда возвращает true. Другие операции, такие как управление политиками, остаются неизменными. Пример:

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")

Comments are powered by giscus and GitHub Discussions. They load from giscus.app and GitHub only after you click the button below.