我有一个使用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
之外,还有其他几个“公共”路由和许多其他门控路由。
一些链接:
2条答案
按热度按时间mf98qq941#
我最终能够把我的大脑围绕在这个过程上。解决方案是为每个单独的路径创建新的negroni。Negroni示例。在上面的例子中:
loginHandler
和indexHandler
都需要具有以下方法签名:对于给定的示例,所有路由都将使用
negroni.Classic()
提供的中间件和添加到server
的sessions
中间件,但只有/
将使用我在authenticator.Get()
中创建的中间件。brjng4g32#
如果使用httprouter,可以通过调用router.lookup函数来获取params。下面是我所做的:
其中路由器是
httprouter.Router
的示例