跳到主要内容

**Logging & Error Handling**

Logging​

Casbin 可以记录请求、模型加载和策略变更。默认情况下,日志记录是关闭的。 通过 Enforcer.EnableLog() 或向 NewEnforcer() 传递 logger 参数来开启它。示例输出:

2017/07/15 19:43:56 [Request: alice, data1, read ---> true]
备注

Go: 您可以插入自定义 logger;Casbin 通过它记录模型、请求、角色和策略。

备注

Python: PyCasbin 使用标准的 logging 模块。像往常一样配置您的应用日志;PyCasbin 使用 logging.getLogger()。可选的 logging_config 文档见 pycasbin/util/log.py。有关设置方法,请参阅 Python logging 和 Django logging。

为不同的 Enforcer 配置独立的 Logger​

每个 Enforcer 都可以拥有自己的 logger,并且可以在运行时更改 logger。

您可以使用 NewEnforcer() 的最后一个参数指定 logger。使用此方法时,logger 的 enabled 字段优先级高于 Enforcer 的 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)

支持的 Logger​

Casbin 提供了多种 logger 实现:

LoggerAuthorDescription
默认 logger(内置)Casbin使用 Go 标准 log 包的默认 logger。
Zap loggerCasbin使用 zap 进行 JSON 编码日志记录,并通过 zap-logger 提供额外的自定义选项。

实现自定义 Logger​

自定义 logger 必须实现 Logger 接口。

MethodTypeDescription
EnableLog()mandatory控制是否打印消息。
IsEnabled()mandatory返回当前 logger 的启用状态。
LogModel()mandatory记录与模型相关的信息。
LogEnforce()mandatory记录与鉴权执行相关的信息。
LogRole()mandatory记录与角色相关的信息。
LogPolicy()mandatory记录与策略相关的信息。

将您的自定义 logger 传递给 Enforcer.SetLogger()。

以下是实现自定义 logger 的 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)
}

Error Handling​

Casbin 中可能因以下原因发生错误或 panic:

  1. 模型文件 (.conf) 中的语法无效
  2. 策略文件 (.csv) 中的语法无效
  3. 来自存储适配器的自定义错误(例如,MySQL 连接失败)
  4. Casbin 缺陷

五个主要函数可能会产生错误或 panic:

FunctionBehavior on Error
NewEnforcer()Returns an error
LoadModel()Returns an error
LoadPolicy()Returns an error
SavePolicy()Returns an error
Enforce()Returns an error
备注

NewEnforcer() 内部会调用 LoadModel() 和 LoadPolicy(),因此在使用 NewEnforcer() 时无需单独调用它们。

启用和禁用权限控制​

你可以使用 Enforcer.EnableEnforce() 来禁用 enforcer。禁用后,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.