gpt4 book ai didi

go - 保护特定的 Pat 路线

转载 作者:数据小太阳 更新时间:2023-10-29 03:11:24 27 4
gpt4 key购买 nike

我想出如何保护特定路线的唯一方法,例如/secret/ 使用 pat是这样的:

app := pat.New()
app.Get("/", hello) // The should be public

shh := pat.New()
shh.Get("/secret", secret) // I want to protect this one only

http.Handle("/secret", protect(shh))
http.Handle("/", app)

我觉得很奇怪,我有两个 pat.Router,我必须小心映射路线。 Full working example.

我是不是错过了做一些更简单的事情的技巧,比如 app.Get("/", protect(http.HandlerFunc(secret)))?但这不起作用,因为我无法 (type http.Handler) as type http.HandlerFunc in argument to app.Get: need type assertion as what I tried .

最佳答案

secret 转换为 http.HandlerFunc所以它可以用作 protect 所期望的 http.Handler。使用 Router.Add它接受 protect 返回的类型。

app := pat.New()
app.Get("/", hello) /
app.Add("GET", "/secret", protect(http.HandlerFunc(secret)))
http.Handle("/", app)

另一种方法是将 protect 更改为接受并返回 func(http.ResponseWriter, *http.Request):

func protect(h func(http.ResponseWriter, *http.Request)) func(http.ResponseWriter, *http.Request) {
return func(w http.ResponseWriter, r *http.Request) {
user, pass, ok := r.BasicAuth()
match := user == "tobi" && pass == "ferret"
if !ok || !match {
w.Header().Set("WWW-Authenticate", `Basic realm="Ferret Land"`)
http.Error(w, "Not authorized", http.StatusUnauthorized)
return
}
h(w, r)
}
}

像这样使用它:

app := pat.New()
app.Get("/", hello)
app.Get("/secret", protect(secret))
http.Handle("/", app)

关于go - 保护特定的 Pat 路线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50753049/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com