Golang中的鉴权实践

807 阅读2分钟

前言

认证 (Authentication)和 鉴权 (Authorization)是不同的概念 本例子是鉴权部分,使用Casbin作为鉴权

什么是 Casbin?

引用自: mp.weixin.qq.com/s/hXYUwZVIK…

Casbin是一个强大的、高效的开源访问控制框架,其权限管理机制支持多种访问控制模型。目前这个框架的生态已经发展的越来越好了。提供了各种语言的类库,自定义的权限模型语言,以及模型编辑器。 Casbin 根本上是依托规则引擎做的软件设计,抽取出来的模型可以做到通用化,能够轻松的使用多种不同的控制模型

Casbin 可以

支持自定义请求的格式,默认的请求格式为{subject, object, action}。 具有访问控制模型 model 和策略 policy 两个核心概念。 支持 RBAC 中的多层角色继承,不止主体可以有角色,资源也可以具有角色。 支持内置的超级用户 例如:rootadministrator。超级用户可以执行任何操作而无需显式的权限声明。 支持多种内置的操作符,如 keyMatch,方便对路径式的资源进行管理,如 /foo/bar 可以映射到 /foo*

鉴权模型

Casbin有很多种模型, 例如:

  • ACL
  • RBAC
  • Restful
  • ABAC

本库是以RBAC模型为例, 通过Casbin的API来实现RBAC模型的鉴权功能.

RBAC模型

一种基于角色的访问控制模型, 该模型定义了以下模型和3种角色: subject 实体, 本库的实体为学生 object 对象, 本库的对象为学生 action 行为, 本库的行为为读和写权限

  • 学生, 只能对学生路由进行读写, 其他路由无权限
  • 教师, 只能对教师路由进行读写, 其他路由无权限
  • 管理员, 对所有的路由进行读写

使用

  1. 拉取本库

    go get github.com/lisa-sum/go-casbin-RBAC
    
  2. 安装依赖

    go mod tidy
    
  3. 运行

    go run main.go
    
  4. 访问路由, 使用不同的角色访问不同的路由, 例如role=student, role=teacher, role=admin, 观察返回的结果

    1. 学生路由:
      curl http://localhost:8080/student/zhangsan?role=student
      
    2. 教师路由:
      curl http://localhost:8080/teacher/zhangsan?role=teacher
      
    3. 管理员路由:
      curl http://localhost:8080/admin/zhangsan?role=admin
      

本例存储库: github.com/lisa-sum/go…

参考

  1. Casbin官网: casbin.org/zh/docs/ove…
  2. Casbin模型: casbin.org/zh/docs/cat…
  3. Casbin编辑器: casbin.org/zh/editor/
  4. mp.weixin.qq.com/s/hXYUwZVIK…