本篇将介绍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 ,开发者按照示例将数据写入该表即可.
表数据的字段含义介绍请参见截图标注的文本.