使用 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")
loginHandler
和 indexHandler
都需要有这个方法签名:
func(http.ResponseWriter, *http.Request, http.HandlerFunc)
对于给定的示例,所有路由都将使用 negroni.Classic()
提供的中间件和添加到 server
的 sessions
中间件,但只有 /
会使用中间件我创建于 authenticator.Get()
.
如果使用 httprouter,可以通过调用 router.Lookup 函数来检索参数。这是我所做的:
_, 参数, _ := router.Lookup("GET", req.URL.Path)
其中 router 是 httprouter.Router
的实例
我有一个使用 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")
loginHandler
和 indexHandler
都需要有这个方法签名:
func(http.ResponseWriter, *http.Request, http.HandlerFunc)
对于给定的示例,所有路由都将使用 negroni.Classic()
提供的中间件和添加到 server
的 sessions
中间件,但只有 /
会使用中间件我创建于 authenticator.Get()
.
如果使用 httprouter,可以通过调用 router.Lookup 函数来检索参数。这是我所做的:
_, 参数, _ := router.Lookup("GET", req.URL.Path) 其中 router 是 httprouter.Router
的实例