使用Negroni的路由特定中间件

时间:2015-02-09 19:55:46

标签: web go middleware

我有一个使用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以及许多其他门控路线也会有其他几条“公共”路线。

一些链接:

2 个答案:

答案 0 :(得分:4)

我最终能够围绕这个过程包围我的大脑。解决方案是为每条路线创建新的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()提供的中间件和sessions中添加的server中间件,但只有/将使用我创建的中间件在authenticator.Get()

答案 1 :(得分:-1)

如果使用httprouter,可以通过调用router.Lookup函数来检索params。这是我做的:

_,params,_:= router.Lookup(“GET”,req.URL.Path) 其中router是httprouter.Router的实例