You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

4.0 KiB

本篇将介绍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等信息的代码如下

currentUser, exist := context.MustGet("userToken").(my_jwt.CustomClaims)

	if exist {
		fmt.Printf("userId%d\n",currentUser.UserId)
	}

Casbin 相关的几个功能介绍

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


// casbin检查用户对应的角色权限是否允许访问接口
func CheckCasbinAuth() gin.HandlerFunc {
	return func(c *gin.Context) {
	
		requstUrl := c.Request.URL.Path
		method := c.Request.Method
		
		// 这里根据用户请求时头部的 token 解析出用户id根据用户id查询出该用户所拥有的角色id(roleId)
		// 主线版本的程序中 角色表需要开发者自行创建、管理Ginskeleton-Admin 系统则集成了所有的基础功能
		// 根据角色roleId判断是否具有某个接口的权限
		roleId := "2" // 模拟最终解析出用户对应的角色为 2 

        // 使用casbin自带的函数执行策略(规则)验证
		isPass, err := variable.Enforcer.Enforce(role, requstUrl, method)
		if err != nil {
			response.ErrorCasbinAuthFail(c, err.Error())
			return
		} else if !isPass {
			response.ErrorCasbinAuthFail(c, "")
		} else {
			c.Next()
		}
	}
}

Casbin 用法

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

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

			}
		}	

Casbin 核心数据表

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

tb_casbin_rules