首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将CAS中间件和httprouter()路由链接起来

将CAS中间件和httprouter()路由链接起来
EN

Stack Overflow用户
提问于 2017-09-26 18:53:05
回答 1查看 481关注 0票数 1

我对可能是一个简单问题的问题深恶痛绝。我需要用呼叫第三方CAS授权服务来结束功能。我使用go-ca来实现这一点,直到我开始添加路由要求,它才起作用。我选择了朱利安·施密特的“Schmidt”,不知怎么的,我也需要让它与围棋一起工作。

如果我没有弄错的话,我需要使用某种定制的中间件来从处理程序转到处理程序。我认为这条链应该是这样的:

http.Handler -> func(http.ResponseWriter,*http.Request,httprouter.Params)

...the首先是CAS想要的,第二个是httprouter想要的。但是我现在太迷茫了,以至于我无法确定该做什么。

谢谢你的建议!

在下面的代码中,调用..。

代码语言:javascript
复制
router.Handler("GET", "/", client.HandleFunc(defaultHandler))

..。产生此错误:

不能将defaultHandler (类型func(http.ResponseWriter,*http.Request,httprouter.Params))用作client.HandleFunc参数中的func(http.ResponseWriter,*http.Request)类型

以下是不工作的代码:

代码语言:javascript
复制
package main

import (
    "fmt"
    "log"
    "net/http"
    "strings"
    "time"

    "github.com/go-cas/cas"
    "github.com/julienschmidt/httprouter"
)

func defaultHandler(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
    if !cas.IsAuthenticated(r) {
        cas.RedirectToLogin(w, r)
    }

    pageID := ps.ByName("pageID")

    type pageModel struct {
        Title    string
        PageID   string
    }

    model := pageModel{
        Title:    "Seminars",
        PageID:    pageID,
    }
    render.ToBrowser(w, "views/index.html", &model)
}


func main() {

    u, _ := url.Parse("https://cas_example_server.com")

    client := cas.NewClient(&cas.Options{
        URL: u,
    })

    router := httprouter.New()

    //This line fails with the message:

    //"Cannot use defaultHandler (type func(http.ResponseWriter, *http.Request, httprouter.Params)) 
    //as type func(http.ResponseWriter, *http.Request) in argument to client.HandleFunc"

    router.Handler("GET", "/", client.HandleFunc(defaultHandler))

    err := http.ListenAndServe(":8080", router)
    if err != nil {
        panic(err)
    }

}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-09-27 12:31:14

中间件可以使用请求上下文将数据传递给具有不同签名的处理程序:

代码语言:javascript
复制
import (
    "net/http"
    "net/url"

    "github.com/go-cas/cas"
    "github.com/julienschmidt/httprouter"
    "golang.org/x/net/context"
)

func defaultHandler(w http.ResponseWriter, r *http.Request) {
    if !cas.IsAuthenticated(r) {
        cas.RedirectToLogin(w, r)
    }

    ps := r.Context().Value("params").(httprouter.Params)

    // business logic
}


func main() {

    u, _ := url.Parse("https://cas_example_server.com")

    client := cas.NewClient(&cas.Options{
        URL: u,
    })

    router := httprouter.New()

    //This line fails with the message:

    //"Cannot use defaultHandler (type func(http.ResponseWriter, *http.Request, httprouter.Params))
    //as type func(http.ResponseWriter, *http.Request) in argument to client.HandleFunc"

    router.Handler("GET", "/", func(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
        newContext := context.WithValue(r.Context(), "params", ps)
        r.WithContext(newContext)
        client.HandleFunc(defaultHandler)(w, r)
    })

    err := http.ListenAndServe(":8080", router)
    if err != nil {
        panic(err)
    }

}

更新:有许多有用的库来保存您的https://github.com/urfave/negroni处理程序堆栈

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46433817

复制
相关文章

相似问题

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