日志

Casbin 内置的 日志 会将日志输出到控制台,如:

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

日志记录默认启用,您可以通过调用 Enforcer.EnableLog()NewEnforcer()构造函数中的最后一个参数来切换它。示例:

  1. // 在构造方法中禁用日志
  2. e := casbin.NewEnforcer("examples/basic_model.conf", "examples/basic_policy.csv", false)
  3. // 在运行时打开日志
  4. e.EnableLog(true)

错误处理

如果您使用 Casbin 时可能会发生 error 或 panic,可能由如下原因造成:

  • model文件 (. file) 中的语法有误。
  • policy文件 (. csv) 中的语法有误。
  • 来adapter的自定义错误信息(譬如连接MySQL失败)。
  • Casbin的bug。
    您需要注意以下五个主要函数出现的error或panic:
函数 异常时表现 如果我想要error而不是panic怎么办?
NewEnforcer() 造成panic 使用NewEnforcerSafe()替代
LoadModel() 造成panic 使用LoadModelSafe()替代
LoadPolicy() 返回error
SavePolicy() 返回error
Enforce() 造成panic 使用EnforceSafe()替代

注:NewEnforcer()内部调用了方法LoadModel()和方法LoadPolicy(),所以如果您调用了NewEnforcer(),就无需再次调用这两个方法。

关于为什么不直接返回所有函数的error

作者认为Golang的异常机制对于开发人员来说是非常不友好的,因为它只是一个字符串,并且没有错误的调用堆栈信息。 Panic 可以显示调用堆栈并能与 Golang IDEs 很好的集成。 大多数Casbin用户同为开发者, 通常在第一次编写Casbin有关的model或是policy多少都会犯错(无论最后是造成error还是panic), panic形式的错误可以使他们获益更多。 当然,比起panic另一些开发者更偏向于使用error, 所以我们也提供了xxxSafe()方法将可能产生xxx()panic的方法转换为error形式抛出。 您可以根据您的个人喜好来选择使用xxx()还是xxxSafe()

Enforcer的启用和禁用

通过调用Enforcer.EnableEnforce(false)方法,我们可以禁用Enforcer。 当Enforcer被禁用时,调用Enforcer.Enforce()会永远返回true。 但是其他操作 (例如添加或删除policy) 不受影响。 以下为一些示例:

  1. e := casbin.NewEnforcer("examples/basic_model.conf", "examples/basic_policy.csv")
  2. // 将会返回false
  3. // 默认情况下enforcer是启用的
  4. e.Enforce("non-authorized-user", "data1", "read")
  5. // 在运行时禁用enforcer
  6. e.EnableEnforce(false)
  7. // 对任何请求都返回true
  8. e.Enforce("non-authorized-user", "data1", "read")
  9. // 打开enforcer
  10. e.EnableEnforce(true)
  11. // 将会返回false
  12. e.Enforce("non-authorized-user", "data1", "read")

原文: https://casbin.org/docs/zh-CN/log-error