zhufuyi / sponge

Sponge is a powerful Go development framework, it's easy to develop web, gRPC and microservice projects.
https://go-sponge.com
MIT License
1.47k stars 146 forks source link

router 的使用请教 #63

Closed hanwenbo closed 2 months ago

hanwenbo commented 2 months ago

假如我使用了 group.Use(middleware.Auth()) // all of the following routes use jwt authentication 那么这整个group就会验证权限, 但部分接口是不需要验证的,如果我在router.go里再单独去定义 会有点不方便,请问大哥有什么好的方法吗

func dishRouter(group *gin.RouterGroup, h handler.DishHandler) { //group.Use(middleware.Auth()) // all of the following routes use jwt authentication // or group.Use(middleware.Auth(middleware.WithVerify(verify))) // token authentication // .....这里额外还想特殊对待一些路由是否可以? }

zhufuyi commented 2 months ago

可以对指定路由添加鉴权中间件

func dishRouter(group *gin.RouterGroup, h handler.DishHandler) {
    group.POST("/dish", middleware.Auth(), h.Create)  // 添加了鉴权中间件
    group.DELETE("/dish/:id", h.DeleteByID) // 没有鉴权
}
hanwenbo commented 2 months ago

感谢~ 我去试试

hanwenbo commented 2 months ago

我发现一个问题,我不知道是不是bug

routers 文件夹有很多模块,那么init会自动初始化, 假如你给任意一个模块,比如user吧加一个

func userRouter(group *gin.RouterGroup, h handler.UserHandler) {
    // 需要认证的路由
    group.Use(AuthMiddleware())
    group.GET("/user/:id", AuthMiddleware(), h.GetByID)
    group.PUT("/user", AuthMiddleware(), h.Update)

}
func searchRouter(group *gin.RouterGroup, h handler.UserHandler) {
    // 注意 这里我没给group.Use(AuthMiddleware()),所以这个路由不需要认证,但实际它是验证了。
    group.GET("/search/:id", AuthMiddleware(), h.GetByID)
    group.PUT("/search", AuthMiddleware(), h.Update)
}

看作者的源码给我感觉是每个模块的group是分离的,但是实际操作来看不是

不确定这是不是bug

zhufuyi commented 2 months ago

因为参数group使用了指针,在一个地方执行group.Use(middleware.Auth()),确实会导致后面所有路由也会自动使用了middleware.Auth(),建议按照下面使用方式

func userExampleRouter(group *gin.RouterGroup, h handler.UserExampleHandler) {
    g := group.Group("/userExample")

    // 下面所有路由都会添加auth鉴权
    //g.Use(middleware.Auth())

    // 如果不是所有路由都需要jwt鉴权,可以单独只为某些路由添加鉴权中间件,此时不要使用上面的g.Use(middleware.Auth())

    g.POST("/", h.Create)
    g.DELETE("/:id", h.DeleteByID)
    g.PUT("/:id", h.UpdateByID)
    g.GET("/:id", h.GetByID)
    g.POST("/list", h.List)
}

func searchRouter(group *gin.RouterGroup, h handler.SearchHandler) {
    // 这里的路由没有使用鉴权
    group.GET("/search/:id", h.GetByID)
    group.PUT("/search", h.Update)
}
hanwenbo commented 2 months ago

收到 感谢 我按 group.PUT("/user", AuthMiddleware(), h.Update) 这种写法来操作了 感觉还行 几百个路由不是问题