权限检查失败时如何提前终止Go语言HTTP handler的执行流程?
实现方案
首先修正你代码里的基础错误:标准库http.Handler的第二个入参类型为*http.Request,你当前写的*http.Response是错误类型,需要先调整。
你可以用以下两种常见方案实现校验失败中断后续逻辑:
方案1:校验函数返回布尔值,handler手动判断
修改CheckPermissionFilter的返回值为布尔类型,校验失败时直接写入错误响应并返回false,handler中判断返回值决定是否继续执行后续逻辑:
func CheckPermissionFilter(w http.ResponseWriter, r *http.Request) bool { sid, err := r.Cookie("sid") if err != nil { // 无有效会话ID返回401未登录 http.Error(w, "Unauthorized", http.StatusUnauthorized) return false } // 此处执行你的权限校验逻辑 if 校验不通过 { http.Error(w, "Permission denied", http.StatusForbidden) return false } return true } func SomeHttpHandler(w http.ResponseWriter, r *http.Request){ // 校验失败直接return中断后续逻辑 if !CheckPermissionFilter(w, r) { return } // 校验通过后执行业务逻辑 }
方案2:标准库风格中间件封装(更推荐)
如果需要校验的接口较多,你可以用中间件模式统一封装,不需要每个handler手动写判断逻辑,复用性更强:
// 权限校验中间件 func PermissionMiddleware(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { sid, err := r.Cookie("sid") if err != nil { http.Error(w, "Unauthorized", http.StatusUnauthorized) return } // 此处执行你的权限校验逻辑 if 校验不通过 { http.Error(w, "Permission denied", http.StatusForbidden) return } // 校验通过执行后续handler next.ServeHTTP(w, r) }) } // 业务handler无需单独加权限判断 func SomeHttpHandler(w http.ResponseWriter, r *http.Request){ // 业务逻辑 } // 路由注册时给需要校验的接口套上中间件即可 func main() { mux := http.NewServeMux() // 不需要权限的公开接口直接注册 mux.HandleFunc("/public", PublicHandler) // 需要权限的私有接口用中间件包裹 mux.Handle("/private", PermissionMiddleware(http.HandlerFunc(SomeHttpHandler))) http.ListenAndServe(":8080", mux) }
内容的提问来源于stack exchange,提问作者armnotstrong
相关产品推荐
相关产品推荐

