本文转载自微信公众号「GoLang全栈」,作者锟。转载本文请联系GoLang全栈公众号。

稍微大一点的项目就一定会涉及到权限管理,这个系列我们给大家介绍一个非常好用的鉴权库 casbin。

它是一个跨平台的库,支持很多种语言的鉴权。

官方文档:https://casbin.org/docs/zh-CN/overview

光讲解这个库的 API 很显然是枯燥的,所以我会结合 Gin,模拟实际开发中的鉴权去给大家讲解他的使用。

所以我们的工程里面会用到到的库如下:

  1. go get github.com/casbin/casbin/v2 
  2. go get github.com/gin-gonic/gin 

配套Github代码

很开心的告诉大家,这个系列的文章我们会把代码开源到 Github 上,为大家学习的路上扫平一切障碍。

我们官方的 Github 代码阅读,地址如下:

  1. https://github.com/GoLangStackDev/casbin-with-mysql-go.git 

本文配套 tag 标记:快速入门

快速入门

来一份入门代码:

  1. package main 
  2.  
  3. import ( 
  4.  "github.com/casbin/casbin/v2" 
  5.  "fmt" 
  6.  
  7. func main() { 
  8.  sub := "lili" 
  9.  obj := "/posts" 
  10.  act := "GET" 
  11.  
  12.  e,err := casbin.NewEnforcer("resources/model.conf","resources/policy.csv") 
  13.  checkError(err) 
  14.  ok,err := e.Enforce(sub,obj,act) 
  15.  checkError(err) 
  16.  if ok { 
  17.   fmt.Println("通过!") 
  18.  }else{ 
  19.   fmt.Println("不通过!") 
  20.  } 
  21. // 统一错误检查 
  22. func checkError(err error)  { 
  23.  if err!=nil { 
  24.   println(err.Error()) 
  25.  } 

我定义了一个方法 checkError 来统一处理报错。

这里面涉及到两个配置文件,分别是 model.conf 和 policy.csv 文件。

内容如下:

model.conf

  1. [request_definition] 
  2. r = sub, obj, act 
  3.  
  4. [policy_definition] 
  5. p = sub, obj, act 
  6.  
  7. [role_definition] 
  8. g = _, _ 
  9.  
  10. [policy_effect] 
  11. e = some(where (p.eft == allow)) 
  12.  
  13. [matchers] 
  14. m = g(r.sub, p.sub) && r.obj == p.obj && r.act == p.act 

policy.csv

  1. p, member, /posts, GET 
  2. p, member, /posts/:id, GET 
  3.  
  4. p, admin, /posts, POST 
  5. p, admin, /posts/:id, PUT 
  6. p, admin, /posts/:id, DELETE 
  7.  
  8. g, admin, member 
  9. g, super, admin 
  10. g, lili, member 

这两个配置文件你现在就暂时先理解为 model.conf 定义了匹配规则,policy.csv 定义了权限组等权限。

具体的解释我们会在下一篇文章详细介绍。

直接运行起来,你会看到控制台输出:

  1. 通过! 

假如此时我们把 act 改成 POST 就不能通过了。

没错 act 就表示我们的请求方法。