我目前正在 golang(使用 Gorilla)构建一个 Web 应用程序,并实现了一些 API 端点。然而,我注意到每次我实现这样的功能时:
func CreateUserHandler(w http.ResponseWriter, r *http.Request) {}
我必须将以下函数添加到处理程序函数的主体中以检查请求是否已授权:
func checkAuthorizedUser (r * http.Request) error {
uid, err := CheckRequestUser (r.Cookie("uid"))
if err != nil {
return errors.New("Can't find cookie value for uid")
}
if !IsValidUser (uid.Value) {
return errors.New("Not a valid user")
}
return nil
}
现在发生在我身上的事情是我必须将
checkAuthorizedUser()
添加到每个处理程序函数中,并且到目前为止我已经有了很多处理程序函数。我想知道除了在每个处理程序函数中显式检查身份验证之外,是否有更好的方法来检查客户端是否有权访问某些端点。
Gorilla 有一个可以使用的路由器。然后,您可以通过身份验证检查来包装路由器。像这样的东西会起作用:
func checkPermissions(h http.Handler) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
authCheck := true //implement the actual checking
if authCheck {
w.WriteError(w, 400, "error")
return
}
h.ServeHttp(w, r)
}
}
func main() {
r := mux.NewRouter()
r.HandleFunc("/", HomeHandler)
r.HandleFunc("/products", ProductsHandler)
r.HandleFunc("/articles", ArticlesHandler)
http.Handle("/", checkPermissions(r))
}
支持链接: