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

文档:https://docs.arklnk.com

前端: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

账号密码备注
demo123456演示账号

权限验证

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

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

官网:https://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)
			}
		}
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值