我有一个使用httprouter和negroni的Web服务器。用户通过外部OAuth登录此系统。我们将令牌保存到表明他们是否已登录的加密会话中。我想使用中间件来验证此令牌是否存在,如果不存在,则将用户踢回到登录页面。我想从身份验证中间件中排除一些路由。negroni自述文件中有一个使用大猩猩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()是我的身份验证处理程序函数,其中包含我认为与问题无关的内容。
/login
/
authenticator.Get()
我怎样才能申请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都需要具有以下方法签名:
loginHandler
indexHandler
func(http.ResponseWriter, *http.Request, http.HandlerFunc)
在给定的示例中,所有路由都将使用所提供的中间件negroni.Classic()以及sessions添加到其中的中间件server,但仅/会使用在中创建的中间件authenticator.Get()。
negroni.Classic()
sessions
server