使用 Negroni 的路由特定中间件

Route-specific Middlewares with Negroni

我有一个使用 httprouter 和 negroni 的网络服务器。用户通过外部 OAuth 登录该系统。我们将令牌保存到加密会话中,指示他们是否已登录。我想使用中间件来验证此令牌是否存在,如果不存在,则将用户踢回登录页面。我想排除某些路由使用身份验证中间件。 negroni README 中有一个使用 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() 是我的身份验证处理函数,其中包含我认为与问题无关的内容。

如何将 authenticator.Get() 应用于 / 而不是 /login?请记住,除了 /login 之外还有其他几条 "public" 路线以及许多其他封闭路线。

一些链接:

我最终能够全神贯注于这个过程。解决方案是为每个单独的路由创建新的 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")

loginHandlerindexHandler 都需要有这个方法签名:

func(http.ResponseWriter, *http.Request, http.HandlerFunc)

对于给定的示例,所有路由都将使用 negroni.Classic() 提供的中间件和添加到 serversessions 中间件,但只有 / 会使用中间件我创建于 authenticator.Get().

如果使用 httprouter,可以通过调用 router.Lookup 函数来检索参数。这是我所做的:

_, 参数, _ := router.Lookup("GET", req.URL.Path) 其中 router 是 httprouter.Router

的实例