diff --git a/auth/auth.go b/auth/auth.go index 58bda33..8b4230e 100644 --- a/auth/auth.go +++ b/auth/auth.go @@ -25,6 +25,7 @@ type UserBackend interface { // User interface for user type User interface { GetHash() string + HasRole(string) bool } // Authorizer handle sesssion diff --git a/auth/middleware.go b/auth/middleware.go new file mode 100644 index 0000000..237e682 --- /dev/null +++ b/auth/middleware.go @@ -0,0 +1,61 @@ +package auth + +import ( + "net/http" + + "github.com/gorilla/context" +) + +type key int + +const ukey key = 0 + +// AuthMiddleware get User from session and put it in context +type Middleware struct { + authorizer *Authorizer +} + +func NewMiddleware(authorizer *Authorizer) *Middleware { + return &Middleware{authorizer} +} + +func (m *Middleware) ServeHTTP(w http.ResponseWriter, r *http.Request, next http.HandlerFunc) { + user, err := m.authorizer.CurrentUser(w, r) + if err != nil { + panic(err) + } + context.Set(r, ukey, user) + next(w, r) +} + +type MiddlewareRole struct { + authorizer *Authorizer + role string +} + +func NewMiddlewareRole(authorizer *Authorizer, role string) *MiddlewareRole { + return &MiddlewareRole{authorizer, role} +} + +func (m *MiddlewareRole) ServeHTTP(w http.ResponseWriter, r *http.Request, next http.HandlerFunc) { + user := GetCurrentUser(r) + + if user == nil || !user.HasRole(m.role) { + //TODO: redirect to login page and save wanted page + return + } + + next(w, r) +} + +func GetCurrentUser(r *http.Request) User { + u := context.Get(r, ukey) + if u == nil { + return nil + } + user, ok := u.(User) + if !ok { + panic("Invalid user type") + } + return user +} diff --git a/main.go b/main.go index eb9f497..6f02535 100644 --- a/main.go +++ b/main.go @@ -10,7 +10,6 @@ import ( "github.com/Sirupsen/logrus" "github.com/codegangsta/negroni" - "github.com/gorilla/mux" "github.com/jmoiron/sqlx" _ "github.com/lib/pq" ) @@ -35,13 +34,17 @@ func main() { uBackend := &UserBackend{db} authorizer := auth.New(uBackend, "peeper", "cookieName", "cookieKey", 10) - env := web.NewEnv(db, authorizer, log, "/templates") + env := web.NewEnv(db, authorizer, log, "./templates") + authMiddleware := auth.NewMiddleware(env.Auth) - router := mux.NewRouter() + env.Handle("users.login", "/users/login", users.LoginHandler) + env.Handle("users.logout", "users/logout", users.LogoutHandler) + env.HandleRole("users.details", "/users/details", users.DetailsHandler, users.UserRole) - router.Handle("/", env.Handler(movies.PolochonMovies)) + env.HandleRole("movies.polochon", "/", movies.PolochonMovies, users.UserRole) n := negroni.Classic() - n.UseHandler(router) + n.Use(authMiddleware) + n.UseHandler(env.Router) n.Run(":3000") } diff --git a/movies/handlers.go b/movies/handlers.go index c0c3697..0b72884 100644 --- a/movies/handlers.go +++ b/movies/handlers.go @@ -4,7 +4,7 @@ import ( "net/http" "github.com/odwrtw/polochon/lib" - "github.com/odwrtw/polochon/modules/tmdb" + "github.com/odwrtw/polochon/modules/mock" "gitlab.quimbo.fr/odwrtw/canape-sql/web" "gitlab.quimbo.fr/odwrtw/papi" @@ -27,7 +27,8 @@ func PolochonMovies(env *web.Env, w http.ResponseWriter, r *http.Request) error movies := []*Movie{} //TODO use configurable detailer - detailer, err := tmdb.New(&tmdb.Params{"57be344f84917b3f32c68a678f1482eb"}) + // detailer, err := tmdb.New(&tmdb.Params{"57be344f84917b3f32c68a678f1482eb"}) + detailer, _ := mock.NewDetailer(nil) if err != nil { return err } diff --git a/sql/0001_initial.up.sql b/sql/0001_initial.up.sql index f43c2ea..a8c4213 100644 --- a/sql/0001_initial.up.sql +++ b/sql/0001_initial.up.sql @@ -17,6 +17,7 @@ CREATE TABLE users ( id uuid PRIMARY KEY DEFAULT gen_random_uuid(), name text NOT NULL UNIQUE, hash text NOT NULL, + admin boolean, LIKE base INCLUDING DEFAULTS ); CREATE TRIGGER update_users_updated_at BEFORE UPDATE ON users FOR EACH ROW EXECUTE PROCEDURE update_updated_at_column(); diff --git a/sqltest/001_data.down.sql b/sqltest/001_data.down.sql new file mode 100644 index 0000000..6f114a7 --- /dev/null +++ b/sqltest/001_data.down.sql @@ -0,0 +1 @@ +DELETE FROM users; diff --git a/sqltest/001_data.up.sql b/sqltest/001_data.up.sql new file mode 100644 index 0000000..c025886 --- /dev/null +++ b/sqltest/001_data.up.sql @@ -0,0 +1,2 @@ +INSERT INTO users (name, hash, admin) VALUES ('test', '$2a$10$DPsyngE6ccXzzE38.JJv3OIpvU/lSjfMyg9CR68F8h6krKIyVJYrW', false); +INSERT INTO users (name, hash, admin) VALUES ('admin', '$2a$10$e3564lLAh.0tIHQu8kfzsunViwd56AvGPeUypuCUcE3Vh09RBZci.', true); diff --git a/templates/layout.tmpl b/templates/layout.tmpl index 1f5bdfe..fe84f02 100644 --- a/templates/layout.tmpl +++ b/templates/layout.tmpl @@ -3,16 +3,8 @@