自定义认证端点

XYGo Admin 2026-04-22 2 次阅读

Auth Endpoint Factory、JWT独立端

如果你的扩展需要独立的用户认证体系(如供应商端、代理商端),可以使用 Auth Endpoint Factory 创建完全独立的 JWT 认证端点,无需修改核心代码。

创建认证端点

go 复制代码
package shop

import (
    "xygo/internal/addon"
    "xygo/internal/library/token"
    "xygo/addons/shop/controller"

    "github.com/gogf/gf/v2/net/ghttp"
)

var supplierAuth = token.NewEndpoint(token.EndpointConfig{
    Name:       "supplier",
    Secret:     "",
    Expires:    86400,
    MultiLogin: true,
    HeaderKey:  "Authorization",
    HeaderType: "Bearer",
    LoginPaths: []string{"/supplier/auth/login"},
})

func init() {
    addon.Register(addon.Module{
        Name: "shop",
        Mount: func(s *ghttp.Server) {
            // 后台管理路由(使用系统 AdminAuth)
            s.Group("/", func(group *ghttp.RouterGroup) {
                group.Middleware(middleware.CORS, middleware.ResponseHandler, middleware.AdminAuth)
                group.Bind(controller.NewAdminV1())
            })

            // 供应商端路由(使用自定义认证)
            s.Group("/supplier", func(group *ghttp.RouterGroup) {
                group.Middleware(middleware.CORS, middleware.ResponseHandler)
                group.Middleware(supplierAuth.Middleware())
                group.Bind(controller.NewSupplierV1())
            })
        },
    })
}

登录接口实现

go 复制代码
func SupplierLogin(ctx context.Context, username, password string) (tokenStr string, expiresIn int64, err error) {
    supplierId := uint64(1001)

    tokenStr, expiresIn, err = supplierAuth.Generate(ctx, supplierId, map[string]any{
        "name":  "供应商A",
        "level": 2,
    })
    return
}

在业务中获取当前用户

go 复制代码
import "xygo/internal/library/contexts"

func SomeLogic(ctx context.Context) {
    user := contexts.GetEndpointUser(ctx, "supplier")
    if user != nil {
        fmt.Println("供应商ID:", user.Id)
        fmt.Println("供应商名:", user.Data["name"])
    }

    userId := contexts.GetEndpointUserId(ctx, "supplier")
}

Endpoint 完整 API

方法 说明
NewEndpoint(cfg) 创建端点实例
Generate(ctx, userId, data) 生成 Token
Parse(ctx, token) 解析 Token
Delete(ctx, token) 删除 Token(登出)
KickByUserId(ctx, userId) 踢下线
Middleware() 生成路由中间件

EndpointConfig 字段

字段 类型 默认值 说明
Name string (必填) 端点唯一标识
Secret string 系统密钥 JWT 签名密钥
Expires int64 系统默认 Token 有效期(秒)
MultiLogin bool false 是否允许多端登录
HeaderKey string Authorization 请求头名称
HeaderType string Bearer 请求头前缀
LoginPaths []string [] 免鉴权路径列表