Files
hotgo/server/internal/logic/tcpserver/server_interceptor.go
2023-07-24 09:35:30 +08:00

76 lines
1.9 KiB
Go

// Package tcpserver
// @Link https://github.com/bufanyun/hotgo
// @Copyright Copyright (c) 2023 HotGo CLI
// @Author Ms <133814250@qq.com>
// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE
package tcpserver
import (
"context"
"github.com/gogf/gf/v2/errors/gcode"
"github.com/gogf/gf/v2/errors/gerror"
"github.com/gogf/gf/v2/os/gtime"
"hotgo/internal/library/network/tcp"
"hotgo/utility/validate"
)
// 免登录路由
var noLoginRouter = map[string]struct{}{
"ServerLoginReq": {}, // 服务登录
}
// 免验证路由
var noVerifyRouter = map[string]struct{}{
"ServerHeartbeatReq": {}, // 心跳
}
func (s *sTCPServer) isNoLoginRouter(router string) bool {
_, ok := noLoginRouter[router]
return ok
}
func (s *sTCPServer) isNoVerifyRouter(router string) bool {
_, ok := noVerifyRouter[router]
return ok
}
// DefaultInterceptor 默认拦截器
func (s *sTCPServer) DefaultInterceptor(ctx context.Context, msg *tcp.Message) (err error) {
conn := tcp.ConnFromCtx(ctx)
// g.Log().Debugf(ctx, "DefaultInterceptor msg:%+v, conn:%+v", msg, gjson.New(conn).String())
// 免登录
if s.isNoLoginRouter(msg.Router) {
return
}
if conn.Auth == nil {
err = gerror.NewCode(gcode.CodeNotAuthorized, "未进行登录认证,请先登录")
return
}
// 检查授权有效期
if conn.Auth.EndAt.Before(gtime.Now()) {
err = gerror.NewCode(gcode.CodeNotAuthorized, "授权已过期")
return
}
// 免验证
if s.isNoVerifyRouter(msg.Router) {
return
}
// 验证路由权限
if len(conn.Auth.Routes) > 0 && !validate.InSlice(conn.Auth.Routes, msg.Router) {
err = gerror.NewCodef(gcode.CodeNotAuthorized, "没有授权路由访问权限:%v", msg.Router)
return
}
return
}
// PreFilterInterceptor 预处理
func (s *sTCPServer) PreFilterInterceptor(ctx context.Context, msg *tcp.Message) (err error) {
// g.Log().Debug(ctx, "PreFilterInterceptor...")
return
}