go - 如何忽略一个路由器以使用 Echo 框架进行 BasicAuth 检查?

标签 go frameworks router basic-authentication

为了使用基本身份验证来保护整个应用程序,这种方式可以为所有路由器做:

package main

import (
    "crypto/subtle"
    "net/http"

    "github.com/labstack/echo/v4"
    "github.com/labstack/echo/v4/middleware"
)

type Message struct {
    Status string `json:"status"`
}

func main() {
    e := echo.New()

    e.Use(middleware.BasicAuth(func(username, password string, c echo.Context) (bool, error) {
        if subtle.ConstantTimeCompare([]byte(username), []byte("username")) == 1 &&
            subtle.ConstantTimeCompare([]byte(password), []byte("password")) == 1 {
            return true, nil
        }
        return false, nil
    }))

    e.GET("/", func(c echo.Context) error {
        return c.String(http.StatusOK, "Hello, World!")
    })

    e.GET("/hello", func(c echo.Context) error {
        return c.String(http.StatusOK, "Hello")
    })

    e.GET("/healthcheck", func(c echo.Context) error {
        u := &Message{
            Status: "OK",
        }
        return c.JSON(http.StatusOK, u)
    })
    e.Logger.Fatal(e.Start(":8080"))
}

如果想忽略一个路由器--/healthcheck对其目标,怎么办?

如果设置e.Use(middleware.BasicAuth)到除/healthcheck之外的每个路由器将解决问题,但它需要很多代码。

最佳答案

您可以 Group路线

package main

import (
    "crypto/subtle"
    "net/http"

    "github.com/labstack/echo/v4"
    "github.com/labstack/echo/v4/middleware"
)

type Message struct {
    Status string `json:"status"`
}

func main() {
    e := echo.New()
    g := e.Group("/")
    g.Use(middleware.BasicAuth(func(username, password string, c echo.Context) (bool, error) {
        if subtle.ConstantTimeCompare([]byte(username), []byte("username")) == 1 &&
            subtle.ConstantTimeCompare([]byte(password), []byte("password")) == 1 {
            return true, nil
        }
        return false, nil
    }))

    g.GET("/", func(c echo.Context) error {
        return c.String(http.StatusOK, "Hello, World!")
    })

    e.GET("/healthcheck", func(c echo.Context) error {
        u := &Message{
            Status: "OK",
        }
        return c.JSON(http.StatusOK, u)
    })
    e.Logger.Fatal(e.Start(":8080"))
}

关于go - 如何忽略一个路由器以使用 Echo 框架进行 BasicAuth 检查?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66609418/

相关文章:

node.js - Remix.run 不使用 node.js 作为后端吗?

Go 关闭并裸露返回

go - 脚踏车停运时的脚踏车工作流程

Java 2d 图形动画框架

networking - 路由器与交换机(网络地址转换)

Angular 4 - 带参数的激活路线

javascript - Angular 6 带 2 个路由器 socket

go - 防止 ReadFile 或 ReadAll 读取 EOF

go - Go 中的抽象模式

ios - 在 iOS 中开发和分发框架