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  }