91 lines
2.3 KiB
Go
91 lines
2.3 KiB
Go
package session
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"errors"
|
|
"net/http"
|
|
"time"
|
|
|
|
"management/internal/erpserver/model/dto"
|
|
"management/internal/pkg/config"
|
|
|
|
"github.com/alexedwards/scs/v2"
|
|
"github.com/redis/go-redis/v9"
|
|
)
|
|
|
|
var ErrNoSession = errors.New("session user not found")
|
|
|
|
// Manager 抽象核心会话操作
|
|
type Manager interface {
|
|
Load(next http.Handler) http.Handler
|
|
GetUser(ctx context.Context, key string) (dto.AuthorizeUser, error)
|
|
PutUser(ctx context.Context, key string, user dto.AuthorizeUser) error
|
|
RenewToken(ctx context.Context) error
|
|
Destroy(ctx context.Context) error
|
|
}
|
|
|
|
type SCSSession struct {
|
|
manager *scs.SessionManager
|
|
}
|
|
|
|
func NewSCSManager(client *redis.Client, conf *config.Config) (Manager, error) {
|
|
sessionManager := scs.New()
|
|
sessionManager.Lifetime = 24 * time.Hour
|
|
sessionManager.IdleTimeout = 2 * time.Hour
|
|
sessionManager.Cookie.Name = "token"
|
|
sessionManager.Cookie.HttpOnly = true
|
|
sessionManager.Cookie.Persist = true
|
|
sessionManager.Cookie.SameSite = http.SameSiteStrictMode
|
|
sessionManager.Cookie.Secure = conf.App.Prod
|
|
|
|
//sqlDB, err := db.DB()
|
|
//if err != nil {
|
|
// return nil, err
|
|
//}
|
|
|
|
// postgres
|
|
// github.com/alexedwards/scs/postgresstore
|
|
// sessionManager.Store = postgresstore.New(sqlDB)
|
|
// pgx
|
|
// github.com/alexedwards/scs/pgxstore
|
|
// sessionManager.Store = pgxstore.New(pool)
|
|
// redis
|
|
sessionManager.Store = NewRedisStore(client)
|
|
return &SCSSession{manager: sessionManager}, nil
|
|
}
|
|
|
|
func (s *SCSSession) Load(next http.Handler) http.Handler {
|
|
return s.manager.LoadAndSave(next)
|
|
}
|
|
|
|
func (s *SCSSession) GetUser(ctx context.Context, key string) (dto.AuthorizeUser, error) {
|
|
data, ok := s.manager.Get(ctx, key).([]byte)
|
|
if !ok || len(data) == 0 {
|
|
return dto.AuthorizeUser{}, ErrNoSession
|
|
}
|
|
|
|
var user dto.AuthorizeUser
|
|
if err := json.Unmarshal(data, &user); err != nil {
|
|
return dto.AuthorizeUser{}, err
|
|
}
|
|
return user, nil
|
|
}
|
|
|
|
func (s *SCSSession) PutUser(ctx context.Context, key string, user dto.AuthorizeUser) error {
|
|
data, err := json.Marshal(&user)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
s.manager.Put(ctx, key, data)
|
|
return nil
|
|
}
|
|
|
|
func (s *SCSSession) RenewToken(ctx context.Context) error {
|
|
return s.manager.RenewToken(ctx)
|
|
}
|
|
|
|
func (s *SCSSession) Destroy(ctx context.Context) error {
|
|
return s.manager.Destroy(ctx)
|
|
}
|