github.com/SupenBysz/gf-admin-community@v0.7.4/internal/logic/sys_session/sys_session.go (about) 1 package sys_session 2 3 import ( 4 "context" 5 "github.com/SupenBysz/gf-admin-community/sys_model" 6 "github.com/SupenBysz/gf-admin-community/sys_service" 7 "github.com/gogf/gf/v2/frame/g" 8 "github.com/gogf/gf/v2/net/ghttp" 9 ) 10 11 type sSysSession struct { 12 contextKey string 13 } 14 15 func init() { 16 sys_service.RegisterSysSession(New()) 17 } 18 19 func New() *sSysSession { 20 return &sSysSession{ 21 contextKey: g.Cfg().MustGet(context.Background(), "service.sessionContextKey", "gf-admin-community").String(), 22 } 23 } 24 25 // Init 初始化上下文对象指针到上下文对象中,以便后续的请求流程中可以修改。 26 func (s *sSysSession) Init(sessionContext *sys_model.SessionContext, r *ghttp.Request, ctx ...*context.Context) { 27 if r != nil { 28 r.SetCtxVar(s.contextKey, sessionContext) 29 } else if len(ctx) > 0 { 30 *ctx[0] = context.WithValue(*ctx[0], s.contextKey, sessionContext) 31 } 32 } 33 34 func (s *sSysSession) NewSessionCtx(ctx context.Context) context.Context { 35 return context.WithValue(ctx, "hasCustom", "") 36 37 } 38 39 func (s *sSysSession) HasCustom(ctx context.Context) bool { 40 return ctx.Value("hasCustom") != nil 41 } 42 43 // GetSessionKey 获取上下文缓存Key 44 func (s *sSysSession) GetSessionKey(ctx context.Context) string { 45 return s.contextKey 46 } 47 48 // Get 获得上下文变量,如果没有设置,那么返回nil 49 func (s *sSysSession) Get(ctx context.Context) *sys_model.SessionContext { 50 value := ctx.Value(s.contextKey) 51 if value == nil { 52 return nil 53 } 54 if localCtx, ok := value.(*sys_model.SessionContext); ok { 55 return localCtx 56 } 57 return nil 58 } 59 60 func (s *sSysSession) SetUserById(ctx *context.Context, userId int64) *sys_model.SessionContext { 61 62 user, err := sys_service.SysUser().GetSysUserById(*ctx, userId) 63 64 if err != nil { 65 return nil 66 } 67 68 token, err := sys_service.Jwt().GenerateToken(*ctx, user) 69 70 if token != nil && err == nil && s.HasCustom(*ctx) { 71 claim := sys_service.Jwt().MakeSession(*ctx, token.Token) 72 73 s.Init(&sys_model.SessionContext{ 74 JwtClaimsUser: claim, 75 Ipv4: "", 76 SessionErrorQueue: nil, 77 }, nil, ctx) 78 79 //s.SetUser(ctx, claim) 80 } 81 82 return nil 83 } 84 85 // SetUser 将上下文信息设置到上下文请求中,注意是完整覆盖 86 func (s *sSysSession) SetUser(ctx context.Context, claimsUser *sys_model.JwtCustomClaims) { 87 if claimsUser.Type == -1 { 88 claimsUser.IsSuperAdmin = true 89 } 90 s.Get(ctx).JwtClaimsUser = claimsUser 91 }