This commit is contained in:
oneao committed 2026-01-27 17:33:32 +08:00
1 parent 8663cb2e3d
commit 83cbf18572
34 files changed
+1938 -1350

No files matched your search

@@ -3,9 +3,11 @@ package middleware
import (
"allapp/utils/jwtx"
"allapp/utils/pathx"
"allapp/utils/redisx"
"allapp/utils/response"
"context"
"strconv"
"strings"
"github.com/cloudwego/hertz/pkg/app"
)
@@ -13,13 +15,14 @@ import (
// 私有 key,防止冲突
type ctxKeyUser struct{}
// ContextUser 保存用户信息,包括 UserID 和 SpaceID
// ContextUser 保存用户信息,包括 UserID、DeviceUUID 和当前 SpaceID
type ContextUser struct {
UserID int64
SpaceID int64
UserID int64
DeviceUUID string
SpaceID int64
}
// Auth 中间件,直接在中间件里过滤白名单路径
// Auth 中间件,支持 header 中传 spaceid 并校验权限
func Auth() app.HandlerFunc {
whitelistPaths := []string{
"/auth/login",
@@ -35,8 +38,8 @@ func Auth() app.HandlerFunc {
return
}
token := string(c.GetHeader("token"))
spaceId := string(c.GetHeader("x-space-id"))
// 校验 token
token := strings.TrimSpace(string(c.GetHeader("token")))
if token == "" {
response.Fail(c).Code(response.HttpCode.Unauthorized).Send()
c.Abort()
@@ -44,30 +47,39 @@ func Auth() app.HandlerFunc {
}
verifyToken, flag := jwtx.VerifyToken(token)
if flag {
user := &ContextUser{
UserID: verifyToken.UserID,
SpaceID: 0,
}
if spaceId != "" {
i, err := strconv.ParseInt(spaceId, 10, 64)
if err != nil {
response.Fail(c).Message("Invalid x-space-id").Send()
c.Abort()
return
}
user.SpaceID = i
}
ctx = setContextUser(ctx, user)
c.Next(ctx)
if !flag {
response.Fail(c).Code(response.HttpCode.RefreshToken).Send()
c.Abort()
return
}
response.Fail(c).Code(response.HttpCode.RefreshToken).Send()
c.Abort()
userID := verifyToken.UserID
// 获取 header 中的 spaceid
spaceIDStr := strings.TrimSpace(string(c.GetHeader("spaceid")))
spaceID, err := strconv.ParseInt(spaceIDStr, 10, 64)
if err != nil || spaceID == 0 {
response.Fail(c).Message("缺少有效 spaceid").Send()
c.Abort()
return
}
// 判断用户是否在该空间
inSpace, err := redisx.HasUserSpace(ctx, userID, spaceID)
if err != nil || !inSpace {
response.Fail(c).Message("无权限访问该空间").Send()
c.Abort()
return
}
// 设置 context
user := &ContextUser{
UserID: userID,
SpaceID: spaceID,
}
ctx = setContextUser(ctx, user)
c.Next(ctx)
}
}
@@ -85,10 +97,9 @@ func GetUserID(ctx context.Context) int64 {
return GetContextUser(ctx).UserID
}
// GetSpaceID 从 context 获取 space_id,并返回是否有效
func GetSpaceID(ctx context.Context) (int64, bool) {
spaceID := GetContextUser(ctx).SpaceID
return spaceID, spaceID != 0
// GetSpaceID 从 context 获取当前 spaceid
func GetSpaceID(ctx context.Context) int64 {
return GetContextUser(ctx).SpaceID
}
// 内部中间件设置 ContextUser
@@ -6,12 +6,15 @@ import (
auth "allapp/biz/router/auth"
money "allapp/biz/router/money"
space "allapp/biz/router/space"
user "allapp/biz/router/user"
"github.com/cloudwego/hertz/pkg/app/server"
)
// GeneratedRegister registers routers generated by IDL.
func GeneratedRegister(r *server.Hertz) {
//INSERT_POINT: DO NOT DELETE THIS LINE!
user.Register(r)
space.Register(r)
auth.Register(r)
@@ -85,3 +85,28 @@ func _enterspaceMw() []app.HandlerFunc {
// your code...
return nil
}
func _user0Mw() []app.HandlerFunc {
// your code...
return nil
}
func _listuserspacesMw() []app.HandlerFunc {
// your code...
return nil
}
func __7bspaceid_7dMw() []app.HandlerFunc {
// your code...
return nil
}
func _kickoutuserMw() []app.HandlerFunc {
// your code...
return nil
}
func _quitspaceMw() []app.HandlerFunc {
// your code...
return nil
}
@@ -19,15 +19,9 @@ func Register(r *server.Hertz) {
root := r.Group("/", rootMw()...)
{
_space := root.Group("/space", _spaceMw()...)
_space.POST("/dissolve", append(_dissolvespaceMw(), space.DissolveSpace)...)
_space.POST("/enter", append(_enterspaceMw(), space.EnterSpace)...)
{
_user := _space.Group("/user", _userMw()...)
_user.POST("/exit", append(_exitspaceMw(), space.ExitSpace)...)
_user.GET("/get", append(_getuserspaceMw(), space.GetUserSpace)...)
_user.POST("/join", append(_joinspaceMw(), space.JoinSpace)...)
_user.POST("/list", append(_listspaceusersMw(), space.ListSpaceUsers)...)
_user.POST("/remove", append(_removespaceuserMw(), space.RemoveSpaceUser)...)
}
_space.POST("/join", append(_joinspaceMw(), space.JoinSpace)...)
_space.POST("/kick", append(_kickoutuserMw(), space.KickOutUser)...)
_space.POST("/quit", append(_quitspaceMw(), space.QuitSpace)...)
_space.POST("/users", append(_listspaceusersMw(), space.ListSpaceUsers)...)
}
}
@@ -0,0 +1,22 @@
// Code generated by hertz generator.
package user
import (
"github.com/cloudwego/hertz/pkg/app"
)
func rootMw() []app.HandlerFunc {
// your code...
return nil
}
func _userMw() []app.HandlerFunc {
// your code...
return nil
}
func _listuserspacesMw() []app.HandlerFunc {
// your code...
return nil
}
@@ -0,0 +1,24 @@
// Code generated by hertz generator. DO NOT EDIT.
package user
import (
user "allapp/biz/handler/user"
"github.com/cloudwego/hertz/pkg/app/server"
)
/*
This file will register all the routes of the services in the master idl.
And it will update automatically when you use the "update" command for the idl.
So don't modify the contents of the file, or your code will be deleted when it is updated.
*/
// Register register routes based on the IDL 'api.${HTTP Method}' annotation.
func Register(r *server.Hertz) {
root := r.Group("/", rootMw()...)
{
_user := root.Group("/user", _userMw()...)
_user.GET("/spaces", append(_listuserspacesMw(), user.ListUserSpaces)...)
}
}