日志
Casbin 内置的 日志
会将日志输出到控制台,如:
2017/07/15 19:43:56 [Request: alice, data1, read ---> true]
日志记录默认启用,您可以通过调用 Enforcer.EnableLog()
或 NewEnforcer()
构造函数中的最后一个参数来切换它。示例:
// 在构造方法中禁用日志
e := casbin.NewEnforcer("examples/basic_model.conf", "examples/basic_policy.csv", false)
// 在运行时打开日志
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) 不受影响。 以下为一些示例:
e := casbin.NewEnforcer("examples/basic_model.conf", "examples/basic_policy.csv")
// 将会返回false
// 默认情况下enforcer是启用的
e.Enforce("non-authorized-user", "data1", "read")
// 在运行时禁用enforcer
e.EnableEnforce(false)
// 对任何请求都返回true
e.Enforce("non-authorized-user", "data1", "read")
// 打开enforcer
e.EnableEnforce(true)
// 将会返回false
e.Enforce("non-authorized-user", "data1", "read")