一尘不染

Negroni的路由特定中间件

go

我有一个使用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()是我的身份验证处理程序函数,其中包含我认为与问题无关的内容。

我怎样才能申请authenticator.Get()/,但不是/login?请记住,旁边还会有其他几条“公共”路线,/login以及许多其他封闭路线。

一些链接:


阅读 213

收藏
2020-07-02

共1个答案

一尘不染

最终,我得以在这个过程中全神贯注。解决方案是为每个单独的路线创建新的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()以及sessions添加到其中的中间件server,但仅/会使用在中创建的中间件authenticator.Get()

2020-07-02