Web 使用Negroni路由特定的中间件
我有一个使用httprouter和negroni的web服务器。用户通过外部OAuth登录此系统。我们将令牌保存到加密会话中,该会话指示它们是否已登录。我想使用一个中间件来验证这个令牌是否存在,如果不存在,则将用户踢回登录页面。我想从使用身份验证中间件中排除一些路由。在negroni自述中有一个例子是用gorilla mux实现的,但我不能完全理解用httprouter实现可伸缩性。下面是与我的服务器设置类似的内容:Web 使用Negroni路由特定的中间件,web,go,middleware,Web,Go,Middleware,我有一个使用httprouter和negroni的web服务器。用户通过外部OAuth登录此系统。我们将令牌保存到加密会话中,该会话指示它们是否已登录。我想使用一个中间件来验证这个令牌是否存在,如果不存在,则将用户踢回登录页面。我想从使用身份验证中间件中排除一些路由。在negroni自述中有一个例子是用gorilla mux实现的,但我不能完全理解用httprouter实现可伸缩性。下面是与我的服务器设置类似的内容: router := httprouter.New() router.GET("
router := httprouter.New()
router.GET("/login", Login) // auth not required
router.GET("/", Index) // auth required
s := negroni.Classic()
s.Use(sessions.Sessions("example-web-dev", cookiestore.New([]byte("some garbage"))))
s.Use(authenticator.Get())
s.UseHandler(router)
其中,/login
是我不希望通过中间件要求授权的路由,/
是authenticator.Get()
是我的身份验证处理程序func,其中包含我认为与问题无关的内容
如何将authenticator.Get()
应用于/
而不是/login
?请记住,在/login
和许多其他门控路由旁边还有其他几个“公共”路由
一些链接:
router := httprouter.New()
router.Handler("GET", "/login",
negroni.New(negroni.HandlerFunc(loginHandler)))
router.Handler("GET", "/",
negroni.New(authenticator.Get(),
negroni.HandlerFunc(indexHandler)))
server := negroni.Classic()
server.UseHandler(router)
server.Use(sessions.Sessions("example-web-dev",
cookiestore.New([]byte("some secret"))))
server.Run(":3000")
loginHandler
和indexHandler
都需要此方法签名:
func(http.ResponseWriter, *http.Request, http.HandlerFunc)
在给定的示例中,所有路由都将使用由
negroni.Classic()
提供的中间件和添加到服务器的会话中间件,但只有/
将使用我在authenticator.Get()
中创建的中间件(如果使用httprouter),可以通过调用router.Lookup函数来检索参数。以下是我所做的:
_,params,:=router.Lookup(“GET”,req.URL.Path)
其中router是httprouter.router的一个实例,但是您不再有权访问处理程序函数中的httprouter.Params
对象。你找到一种方法仍然可以访问这些吗?@Tharsan-不幸的是,我从来都无法访问httprouter.Params
。我目前的解决方法是从URL解析我需要的信息,这有点可怕,但很实用。