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.

89 lines
4.0 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

### 本篇将介绍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等信息的代码如下
```code
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, 中间件的作用介绍:
```code
// 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会根据用户请求的三个要求匹配数据库相关设置,匹配成功方可进入路由,否则直接在中间件拦截本次请求.
```code
// 【需要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](https://www.ginskeleton.com/images/casbin_introduce.jpg)