這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
今晚簡單擼了一個,感覺蠻簡潔實用,可以 share 出來
mux_filter.go
123456789101112131415161718192021222324252627282930313233343536373839 |
package utilsimport ( "net/http" "github.com/gorilla/mux")var router *mux.Routertype HttpFunc func(w http.ResponseWriter, r *http.Request) booltype RouteFilter struct { filters []HttpFunc hdlr http.HandlerFunc}func NewRouteFilter() *RouteFilter { return &RouteFilter{}}func (f *RouteFilter) AddFilter(h HttpFunc) *RouteFilter { f.filters = append(f.filters, h) return f}func (f *RouteFilter) Handler(h http.HandlerFunc) *RouteFilter { f.hdlr = h return f}func (f *RouteFilter) ServeHTTP(w http.ResponseWriter, req *http.Request) { for _, hdlr := range f.filters { if !hdlr(w, req) { return } } f.hdlr(w, req)}
|
使用方法 (實現一個 Basic Auth 的 Filter):
utils.go
12345678910111213141516171819202122232425262728293031 |
package commonimport ("net/http""strings")type AuthFunc func(string, string) boolfunc AuthFilterWrapper(authFunc AuthFunc) func(w http.ResponseWriter, r *http.Request) bool {return func(w http.ResponseWriter, r *http.Request) bool {_, ok := r.Header["Authorization"]if !ok {http.Error(w, "Need Authorization Header", http.StatusBadRequest)return false}auth := strings.SplitN(r.Header["Authorization"][0], " ", 2)if len(auth) != 2 {http.Error(w, "Bad Syntax", http.StatusBadRequest)return false}if !authFunc(auth[0], auth[1]) {http.Error(w, "Authorization Failed", http.StatusUnauthorized)return false}return true}}
|
app.go
1234567891011121314151617181920212223242526 |
func UserAuth(method, payload string) bool { switch method { case "Basic": p, _ := base64.StdEncoding.DecodeString(payload) pair := strings.SplitN(string(p), ":", 2) if len(pair) != 2 { return false } return true case "Token": return true } return false}func InitHandlers(r *mux.Router) { s := r.PathPrefix(URL_PREFIX).Subrouter() s.Handle("/test", utils.NewRouteFilter(). AddFilter(common.AuthFilterWrapper(UserAuth)). Handler(testHandler))}func testHandler(w http.ResponseWriter, r *http.Request) { w.Write([]byte("OK"))}
|