前端:https://github.com/arklnk/ark-admin-vuenext
后端:https://github.com/arklnk/ark-admin-zero
go-zero:https://go-zero.dev/cn
演示: http://arkadmin.si-yee.com
账号 密码 备注 demo 123456 演示账号
权限验证
JWT是JSON Web Token的缩写,是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519)。
JWT本身没有定义任何技术实现,它只是定义了一种基于Token的会话管理的规则,涵盖Token需要包含的标准内容和Token的生成过程。
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)
}
}
}
}