手把手开发Admin 系列六(中间件篇)

192 阅读1分钟

文档:docs.arklnk.com

前端:github.com/arklnk/ark-…

后端:github.com/arklnk/ark-…

go-zero:go-zero.dev/cn

演示: arkadmin.si-yee.com

账号密码备注
demo123456演示账号

权限验证

JWT是JSON Web Token的缩写,是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519)。

JWT本身没有定义任何技术实现,它只是定义了一种基于Token的会话管理的规则,涵盖Token需要包含的标准内容和Token的生成过程。

官网:jwt.io

ark-admin使用JWT作为会话管理,这权限验证这块,ark-admin定义了一个权限验证中间件。客户端请求过来时,首先先判断header的Authorization是否有效,如果有效则解析出当前登录用户的id,然后再判断当前用户id是否处于登录状态,如果登录已失效的话,则让其重新登录,反之则获取当前请求的路径,接着判断该用户是否有权限操作该请求路径,如果无权限则终止请求,反之则放行请求。

代码实现如下

路径:app/core/cmd/api/internal/middleware/permmenuauthmiddleware.go

package middleware
​
import (
    "net/http"
    "strconv"
    "strings""ark-admin-zero/common/errorx"
    "ark-admin-zero/common/utils"
    "ark-admin-zero/config""github.com/zeromicro/go-zero/core/stores/redis"
    "github.com/zeromicro/go-zero/rest/httpx"
)
​
type PermMenuAuthMiddleware struct {
    Redis *redis.Redis
}
​
func NewPermMenuAuthMiddleware(r *redis.Redis) *PermMenuAuthMiddleware {
    return &PermMenuAuthMiddleware{
        Redis: r,
    }
}
​
func (m *PermMenuAuthMiddleware) Handle(next http.HandlerFunc) http.HandlerFunc {
    return func(w http.ResponseWriter, r *http.Request) {
        if len(r.Header.Get("Authorization")) > 0 {
            userId := utils.GetUserId(r.Context())
            online, err := m.Redis.Get(config.SysOnlineUserCachePrefix + strconv.FormatUint(userId, 10))
            if err != nil || online == "" {
                httpx.Error(w, errorx.NewDefaultError(errorx.AuthErrorCode))
                var erring any
                erring = "Auth fail"
                panic(erring)
            }
​
            uri := strings.Split(r.RequestURI, "?")
            is, err := m.Redis.Sismember(config.SysPermMenuCachePrefix+strconv.FormatUint(userId, 10), uri[0])
            if err != nil || is != true {
                httpx.Error(w, errorx.NewDefaultError(errorx.NotPermMenuErrorCode))
            } else {
                next(w, r)
            }
        }
    }
}