本篇将介绍Casbin模块的基本用法

1.Casbin(https://github.com/casbin/casbin) 提供了一款跨语言的接口访问权限管控机制,针对go语言支持的最为全面.
2.该模块的使用看起来非常复杂,只要理解了其核心思想,使用是非常简单易懂的.

前言

1.Casbin 的初始化在 GinSkeleton 主线版本默认没有开启,请参照配置文件(config/config.yml)文件中 casbin 部分,自行决定是否开启,默认的配置项属于标准配置,基本不需要改动.
2.配置文件开启 Casbin 模块后,默认会在连接的数据库创建一张表,具体表名参见配置文件说明.

根据用户请求接口时头部附带的token解析用户id等信息

每个用户带有token的请求,在验证ok之后自动会将token绑定在上下文(gin.Context) ,绑定的键名默认为: userToken(配置文件可自行设置键名)
通过token解析出用户id等信息的代码如下:

  1. currentUser, exist := context.MustGet("userToken").(my_jwt.CustomClaims)
  2. if exist {
  3. fmt.Printf("userId:%d\n",currentUser.UserId)
  4. }

Casbin 相关的几个功能介绍

1.Casbin 中间件,相关位置: app/http/middleware/authorization/auth.go, 中间件的作用介绍:

  1. // casbin检查用户对应的角色权限是否允许访问接口
  2. func CheckCasbinAuth() gin.HandlerFunc {
  3. return func(c *gin.Context) {
  4. requstUrl := c.Request.URL.Path
  5. method := c.Request.Method
  6. // 这里根据用户请求时头部的 token 解析出用户id,根据用户id查询出该用户所拥有的角色id(roleId)
  7. // 主线版本的程序中 角色表需要开发者自行创建、管理,Ginskeleton-Admin 系统则集成了所有的基础功能
  8. // 根据角色(roleId)判断是否具有某个接口的权限
  9. roleId := "2" // 模拟最终解析出用户对应的角色为 2
  10. // 使用casbin自带的函数执行策略(规则)验证
  11. isPass, err := variable.Enforcer.Enforce(role, requstUrl, method)
  12. if err != nil {
  13. response.ErrorCasbinAuthFail(c, err.Error())
  14. return
  15. } else if !isPass {
  16. response.ErrorCasbinAuthFail(c, "")
  17. } else {
  18. c.Next()
  19. }
  20. }
  21. }

Casbin 用法

1.Casbin 负责检查用户请求时后台是否允许访问某个接口(路由地址),作为用户的一次请求,主要有三个要素:
1.1 请求的地址(url)
1.2 请求的方式(GET 、 POST 等)
1.3 请求时用户的身份(角色Id,可以根据token解析出用户id,再根据用户id查询出对应的角色ID)
2.Casbin会根据用户请求的三个要求匹配数据库相关设置,匹配成功方可进入路由,否则直接在中间件拦截本次请求.

  1. // 【需要token】中间件验证的路由
  2. // 在某个分组或者模块,我们追加token校验完成后的具体模块接口校验机制
  3. // 追加 authorization.CheckCasbinAuth() 中间件,凡是用户访问就必须经过 token校验+casbin 接口权限校验
  4. // casbin 匹配策略时需要将用户id 转为角色id,因此必须放在 token 中间件后面(token中才能解析出用户id)
  5. backend.Use(authorization.CheckTokenAuth(), authorization.CheckCasbinAuth() )
  6. {
  7. // 用户组路由
  8. users := backend.Group("users/")
  9. {
  10. // 查询
  11. users.GET("list", validatorFactory.Create(consts.ValidatorPrefix+"UserList"))
  12. // 新增
  13. users.POST("create", validatorFactory.Create(consts.ValidatorPrefix+"UserCreate"))
  14. // 更新
  15. users.POST("edit", validatorFactory.Create(consts.ValidatorPrefix+"UserEdit"))
  16. // 删除
  17. users.POST("destroy", validatorFactory.Create(consts.ValidatorPrefix+"UserDestroy"))
  18. }
  19. }

Casbin 核心数据表

只要在配置文件(config/config.yml)开启Casbin相关的配置项,程序启动会默认创建一个表:tb_auth_casbin_rule ,开发者按照示例将数据写入该表即可.
表数据的字段含义介绍请参见截图标注的文本.

casbin接口访问权限控制 - 图1