代码之家  ›  专栏  ›  技术社区  ›  hendry

保护特定的pat路径

  •  0
  • hendry  · 技术社区  · 6 年前

    我唯一知道如何保护特定路线的方法,例如 /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)
    

    我觉得奇怪,我有两个帕特。路由器和我必须小心地图的路线。 Full working example.

    我是不是错过了一个简单的技巧 app.Get("/", protect(http.HandlerFunc(secret))) ?但这不管用因为我不能 (type http.Handler) as type http.HandlerFunc in argument to app.Get: need type assertion 作为 what I tried .

    1 回复  |  直到 6 年前
        1
  •  1
  •   Cerise Limón    6 年前

    转换 secret http.HandlerFunc 所以它可以作为 http.Handler 预期由 protect . 使用 Router.Add 它接受 保护 .

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

    另一种方法是改变 保护 接受并返回 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)