首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >保护特定Pat路由

保护特定Pat路由
EN

Stack Overflow用户
提问于 2018-06-08 03:44:51
回答 1查看 53关注 0票数 0

我想出了如何保护特定路由的唯一方法,例如/secret,但让/使用拍拍是这样的:

代码语言:javascript
复制
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.Routers,我必须小心地绘制路线。完整的工作例子。

我是不是错过了一个技巧来做一些更简单的事情,比如app.Get("/", protect(http.HandlerFunc(secret)))?但这是行不通的,因为我不能(type http.Handler) as type http.HandlerFunc in argument to app.Get: need type assertion作为我试过的

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-08 03:50:39

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

代码语言:javascript
复制
app := pat.New()
app.Get("/", hello) /
app.Add("GET", "/secret", protect(http.HandlerFunc(secret)))
http.Handle("/", app)

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

代码语言:javascript
复制
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)
    }
}

像这样使用它:

代码语言:javascript
复制
app := pat.New()
app.Get("/", hello) 
app.Get("/secret", protect(secret))
http.Handle("/", app)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50753049

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档