In this post I'm going to describe how can we limit user access to the specific url in golang web application. I will use chi router - a lightweight, idiomatic and composable router for building Go HTTP services.
Let's create our main package.
package main
import (
"net/http"
"github.com/go-chi/chi"
)
func main() {
r := chi.NewRouter()
r.Get("/", homePageHandler)
r.Get("/admin", adminPageHandler)
http.ListenAndServe(":3000", r)
}
func homePageHandler(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("This is home page"))
}
func adminPageHandler(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("This is admin page"))
}
After this, if we go to the /admin
page, we will see "This is admin page".
Now, let's make this path accessible only for admin.
We have to replace
r.Get("/admin", adminPageHandler)
With
r.Mount("/admin", adminRouter())
Mount attaches another http.Handler or chi Router as a subrouter along a routing path.
Then, we have to attach middleware inside adminRouter() function.
func adminRouter() http.Handler {
r := chi.NewRouter()
// Middleware with access rules for router.
r.Use(AdminOnly)
r.Get("/", adminPageHandler)
return r
}
In this middleware we have a simple check is user authorized to access this page or not.
func AdminOnly(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
// If user is admin, allows access.
if IsLoggedInAdmin(r) {
next.ServeHTTP(w, r)
} else {
// Otherwise, 403.
http.Error(w, http.StatusText(403), 403)
return
}
return
})
}
In sake of demonstration, I'm going just to use a random bool function to decide is used admin or not. You can modify this function according to your user authentication model.
func IsLoggedInAdmin(r *http.Request) bool {
return rand.Float32() < 0.5
}
And that's it. Looks really simple, Isn't it?
Let's go to to the /admin
page again.
As you see, now, sometimes (depends on our random decider), user has no access to this page anymore.
You can find source code here
Top comments (0)