Защита определенного маршрута Пата - PullRequest
0 голосов
/ 08 июня 2018

Единственный способ, которым я понял, как защитить определенный маршрут, например, /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)

Я нахожу этоСтранно, что у меня есть два пат.Рутера, и я должен быть осторожен, чтобы наметить маршруты. Полный рабочий пример.

Мне не хватает хитрости, чтобы сделать что-то попроще, например, app.Get("/", protect(http.HandlerFunc(secret)))?Но это не работает, так как я не могу (type http.Handler) as type http.HandlerFunc in argument to app.Get: need type assertion как , что я пытался .

1 Ответ

0 голосов
/ 08 июня 2018

Преобразование secret в http.HandlerFunc , чтобы его можно было использовать как http.Handler, ожидаемое protect.Используйте 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...