本文转载自微信公众号「GoLang全栈」,作者锟。转载本文请联系GoLang全栈公众号。
稍微大一点的项目就一定会涉及到权限管理,这个系列我们给大家介绍一个非常好用的鉴权库 casbin。
它是一个跨平台的库,支持很多种语言的鉴权。
官方文档:https://casbin.org/docs/zh-CN/overview
光讲解这个库的 API 很显然是枯燥的,所以我会结合 Gin,模拟实际开发中的鉴权去给大家讲解他的使用。
所以我们的工程里面会用到到的库如下:
- go get github.com/casbin/casbin/v2
- go get github.com/gin-gonic/gin
配套Github代码
很开心的告诉大家,这个系列的文章我们会把代码开源到 Github 上,为大家学习的路上扫平一切障碍。
我们官方的 Github 代码阅读,地址如下:
- https://github.com/GoLangStackDev/casbin-with-mysql-go.git
本文配套 tag 标记:快速入门
快速入门
来一份入门代码:
- package main
- import (
- "github.com/casbin/casbin/v2"
- "fmt"
- )
- func main() {
- sub := "lili"
- obj := "/posts"
- act := "GET"
- e,err := casbin.NewEnforcer("resources/model.conf","resources/policy.csv")
- checkError(err)
- ok,err := e.Enforce(sub,obj,act)
- checkError(err)
- if ok {
- fmt.Println("通过!")
- }else{
- fmt.Println("不通过!")
- }
- }
- // 统一错误检查
- func checkError(err error) {
- if err!=nil {
- println(err.Error())
- }
- }
我定义了一个方法 checkError 来统一处理报错。
这里面涉及到两个配置文件,分别是 model.conf 和 policy.csv 文件。
内容如下:
model.conf
- [request_definition]
- r = sub, obj, act
- [policy_definition]
- p = sub, obj, act
- [role_definition]
- g = _, _
- [policy_effect]
- e = some(where (p.eft == allow))
- [matchers]
- m = g(r.sub, p.sub) && r.obj == p.obj && r.act == p.act
policy.csv
- p, member, /posts, GET
- p, member, /posts/:id, GET
- p, admin, /posts, POST
- p, admin, /posts/:id, PUT
- p, admin, /posts/:id, DELETE
- g, admin, member
- g, super, admin
- g, lili, member
这两个配置文件你现在就暂时先理解为 model.conf 定义了匹配规则,policy.csv 定义了权限组等权限。
具体的解释我们会在下一篇文章详细介绍。
直接运行起来,你会看到控制台输出:
- 通过!
假如此时我们把 act 改成 POST 就不能通过了。
没错 act 就表示我们的请求方法。