loginstatuscheck_middleware.go 1.2 KB
package middleware

import (
	"github.com/zeromicro/go-zero/rest/httpx"
	"gitlab.fjmaimaimai.com/allied-creation/su-micro/pkg/contextdata"
	"gitlab.fjmaimaimai.com/allied-creation/su-micro/pkg/xerr"
	"net/http"
)

type LoginStatusCheckMiddleware struct {
	compareFunc func(int64, string) error
	secret      string
}

func NewLoginStatusCheckMiddleware(fn func(int64, string) error, secret string) *LoginStatusCheckMiddleware {
	return &LoginStatusCheckMiddleware{compareFunc: fn}
}

func (m *LoginStatusCheckMiddleware) Handle(next http.HandlerFunc) http.HandlerFunc {
	return func(w http.ResponseWriter, r *http.Request) {
		token := r.Header.Get("Authorization")
		if len(token) < 6 {
			httpx.ErrorCtx(r.Context(), w, xerr.NewCodeErr(xerr.TokenExpireError, nil))
			return
		}
		token = token[6:]
		if tmpCtx, err := contextdata.ParseToken(r.Context(), m.secret, token); err != nil {
			httpx.ErrorCtx(r.Context(), w, xerr.NewCodeErr(xerr.TokenExpireError, nil))
			return
		} else {
			userToken := contextdata.GetUserTokenFromCtx(tmpCtx)
			if err = m.compareFunc(userToken.UserId, token); err != nil {
				httpx.ErrorCtx(r.Context(), w, xerr.NewCodeErr(xerr.TokenExpireError, err))
				return
			}
		}
		next(w, r)
	}
}