【问题标题】:Passing parameters to Echo route middleware将参数传递给 Echo 路由中间件
【发布时间】:2019-10-03 06:42:19
【问题描述】:

如何在 Echo 中将参数传递给中间件?有一个我想要实现的例子。

func (h *handlers) Check(pm string, next echo.HandlerFunc) echo.HandlerFunc {
    return func(c echo.Context) error {
        if pm == "test" {
            return next(c)
        }
        return echo.NewHTTPError(http.StatusUnauthorized, "")
    }
}

我想这样设置中间件:

route.Use(middleware.Check("test input"))

【问题讨论】:

    标签: go middleware go-echo


    【解决方案1】:

    您可以使用闭包将参数提供给中间件,如下所示:

    func (h *handlers) Check(adminName string) echo.MiddlewareFunc {
        return func(next echo.HandlerFunc) echo.HandlerFunc {
            return func(c echo.Context) error {
                if c.QueryParam("username") == adminName {
                    return next(c)
                }
                return echo.NewHTTPError(http.StatusUnauthorized, "")
            }
        }
    }
    

    这里中间件检查查询参数username是否匹配中间件参数adminName。在此示例中,如果知道正确的用户名,任何人都可以获得管理员身份,因此没有安全性。您可能想要使用 BasicAuth 或 JWT 中间件,它们已经可用于echo。查看echo/middleware/basic_auth.go 以获得更好的示例。

    您可以按照您的问题设置中间件:

    route.Use(middleware.Check("admin"))
    

    【讨论】:

    • 我已经以与您的问题相同的方式使用该参数,但显然使用这样的中间件没有太大价值。
    • 我想要这个中间件通过将所需的角色作为参数传递给中间件来检查用户访问级别,你的方法是什么? @clément
    • 如果您想为中间件设置参数,我的回答适用。我认为您要做的是从查询中获取参数,您可以从上下文中获取该参数。您可以将两者结合起来,我已经编辑了我的答案来说明。
    • 不,我想从中间件函数中获取参数。我想要一个用于所有不同 ACL 检查的中间件,例如 adminRoute.Use(Check(admin)) 和 userRoute.Use(Check(user))。 @clément
    • 对,我明白了。好吧,答案中的代码适用于此。
    猜你喜欢
    • 2020-02-06
    • 1970-01-01
    • 2023-03-20
    • 2019-03-03
    • 2018-08-14
    • 2017-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多