package main import ( "github.com/kataras/iris/v12" ) func newApp() *iris.Application { app := iris.New() v1 := app.Party("/api/v1") myFilter := func(ctx iris.Context) bool { // don't do that on production, use session or/and database calls and etc. ok, _ := ctx.URLParamBool("admin") return ok } onlyWhenFilter1 := func(ctx iris.Context) { ctx.Application().Logger().Infof("admin: %#+v", ctx.URLParams()) ctx.Writef("Admin\n") ctx.Next() } onlyWhenFilter2 := func(ctx iris.Context) { // You can always use the per-request storage // to perform actions like this ofc. // // this handler: ctx.Values().Set("is_admin", true) // next handler: isAdmin := ctx.Values().GetBoolDefault("is_admin", false) // // but, let's simplify it: ctx.HTML("

Hello Admin


") ctx.Next() } // HERE: // It can be registered anywhere, as a middleware. // It will fire the `onlyWhenFilter1` and `onlyWhenFilter2` as middlewares (with ctx.Next()) // if myFilter pass otherwise it will just continue the handler chain with ctx.Next() by ignoring // the `onlyWhenFilter1` and `onlyWhenFilter2`. myMiddleware := iris.NewConditionalHandler(myFilter, onlyWhenFilter1, onlyWhenFilter2) v1UsersRouter := v1.Party("/users", myMiddleware) v1UsersRouter.Get("/", func(ctx iris.Context) { ctx.HTML("requested: /api/v1/users") }) return app } func main() { app := newApp() // http://localhost:8080/api/v1/users // http://localhost:8080/api/v1/users?admin=true app.Listen(":8080") }