Go语言 基于Negroni的路由中间件

wljmcqd8  于 2022-12-31  发布在  Go
关注(0)|答案(2)|浏览(170)

我有一个使用httprouter和negroni的Web服务器。用户通过外部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()是我的身份验证处理程序func,其中包含我认为与问题无关的内容。
如何将authenticator.Get()应用于/而不是/login?请记住,除了/login之外,还有其他几个“公共”路由和许多其他门控路由。
一些链接:

mf98qq94

mf98qq941#

我最终能够把我的大脑围绕在这个过程上。解决方案是为每个单独的路径创建新的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()中创建的中间件。

brjng4g3

brjng4g32#

如果使用httprouter,可以通过调用router.lookup函数来获取params。下面是我所做的:

_, params, _ :=  router.Lookup("GET", req.URL.Path)

其中路由器是httprouter.Router的示例

相关问题