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.

83 lines
1.8 KiB

3 years ago
/*
* @desc:token功能
*
*
* @Date: 2022/3/8 15:54
*/
package service
import (
"context"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/net/ghttp"
"github.com/gogf/gf/v2/os/gctx"
"github.com/tiger1103/gfast-token/gftoken"
"sync"
"tyj_admin/internal/consts"
"tyj_admin/internal/model"
"tyj_admin/library/liberr"
)
type IGfToken interface {
GenerateToken(ctx context.Context, key string, data interface{}) (keys string, err error)
Middleware(group *ghttp.RouterGroup) error
ParseToken(r *ghttp.Request) (*gftoken.CustomClaims, error)
IsLogin(r *ghttp.Request) (b bool, failed *gftoken.AuthFailed)
GetRequestToken(r *ghttp.Request) (token string)
RemoveToken(ctx context.Context, token string) (err error)
}
type gfTokenImpl struct {
*gftoken.GfToken
}
var gT = gfTokenImpl{
GfToken: gftoken.NewGfToken(),
}
func GfToken(options *model.TokenOptions) IGfToken {
var fun gftoken.OptionFunc
if options.CacheModel == consts.CacheModelRedis {
fun = gftoken.WithGRedis()
} else {
fun = gftoken.WithGCache()
}
gT.GfToken = gftoken.NewGfToken(
gftoken.WithCacheKey(options.CacheKey),
gftoken.WithTimeout(options.Timeout),
gftoken.WithMaxRefresh(options.MaxRefresh),
gftoken.WithMultiLogin(options.MultiLogin),
gftoken.WithExcludePaths(options.ExcludePaths),
fun,
)
return &gT
}
// =======================system==========================
type gft struct {
options *model.TokenOptions
gT IGfToken
lock *sync.Mutex
}
var gftService = &gft{
options: nil,
gT: nil,
lock: &sync.Mutex{},
}
func SysGfToken() IGfToken {
if gftService.gT == nil {
gftService.lock.Lock()
defer gftService.lock.Unlock()
if gftService.gT == nil {
ctx := gctx.New()
err := g.Cfg().MustGet(ctx, "gfToken").Struct(&gftService.options)
liberr.ErrIsNil(ctx, err)
gftService.gT = GfToken(gftService.options)
}
}
return gftService.gT
}