package app import ( "fmt" "net" "net/http" "github.com/casbin/casbin/v3" "github.com/xlgmokha/x/pkg/x" "gitlab.com/mokhax/spike/pkg/authz" "gitlab.com/mokhax/spike/pkg/cfg" "gitlab.com/mokhax/spike/pkg/srv" ) func WithCasbin() authz.Authorizer { enforcer := x.Must(casbin.NewEnforcer("model.conf", "policy.csv")) return authz.AuthorizerFunc(func(r *http.Request) bool { host, _, err := net.SplitHostPort(r.Host) if err != nil { return false } subject, found := authz.TokenFrom(r).Subject() if !found { subject = "*" } ok, err := enforcer.Enforce(subject, host, r.Method, r.URL.Path) if err != nil { fmt.Printf("%v\n", err) return false } fmt.Printf("%v: %v -> %v %v%v\n", ok, subject, r.Method, host, r.URL.Path) return ok }) } func Start(bindAddr string) error { return srv.Run(cfg.New( bindAddr, cfg.WithMux(authz.HTTP(WithCasbin(), Routes())), )) }