Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Web 使用Negroni路由特定的中间件_Web_Go_Middleware - Fatal编程技术网

Web 使用Negroni路由特定的中间件

Web 使用Negroni路由特定的中间件,web,go,middleware,Web,Go,Middleware,我有一个使用httprouter和negroni的web服务器。用户通过外部OAuth登录此系统。我们将令牌保存到加密会话中,该会话指示它们是否已登录。我想使用一个中间件来验证这个令牌是否存在,如果不存在,则将用户踢回登录页面。我想从使用身份验证中间件中排除一些路由。在negroni自述中有一个例子是用gorilla mux实现的,但我不能完全理解用httprouter实现可伸缩性。下面是与我的服务器设置类似的内容: router := httprouter.New() router.GET("

我有一个使用httprouter和negroni的web服务器。用户通过外部OAuth登录此系统。我们将令牌保存到加密会话中,该会话指示它们是否已登录。我想使用一个中间件来验证这个令牌是否存在,如果不存在,则将用户踢回登录页面。我想从使用身份验证中间件中排除一些路由。在negroni自述中有一个例子是用gorilla mux实现的,但我不能完全理解用httprouter实现可伸缩性。下面是与我的服务器设置类似的内容:

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
和许多其他门控路由旁边还有其他几个“公共”路由

一些链接:


我终于能够将我的大脑围绕在这个过程中。解决方案是为每个单独的路由创建新的negroni.negroni实例。在上述情况下:

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解析我需要的信息,这有点可怕,但很实用。