diff --git a/backend/main.go b/backend/main.go index 0a01aa0..4824c0d 100644 --- a/backend/main.go +++ b/backend/main.go @@ -201,9 +201,12 @@ func main() { // Routes enregistrées par les modules actifs for _, route := range loader.Registry().GetRoutes() { routeCopy := route // Capturer la variable pour la closure - if routeCopy.RequireAdmin { + switch { + case routeCopy.Public: + r.MethodFunc(routeCopy.Method, routeCopy.Path, routeCopy.Handler) + case routeCopy.RequireAdmin: r.With(api.RequireAuth(jwtManager), api.RequireAdmin).MethodFunc(routeCopy.Method, routeCopy.Path, routeCopy.Handler) - } else { + default: r.With(api.RequireAuth(jwtManager)).MethodFunc(routeCopy.Method, routeCopy.Path, routeCopy.Handler) } } diff --git a/backend/modules/loader.go b/backend/modules/loader.go index 3ddc9d9..4150254 100644 --- a/backend/modules/loader.go +++ b/backend/modules/loader.go @@ -80,6 +80,7 @@ type RouteEntry struct { Path string Handler http.HandlerFunc RequireAdmin bool + Public bool // true = pas d'authentification requise (ex: pages HTML) } type migrationEntry struct { @@ -118,7 +119,12 @@ func newCoreRegistry(sqlDB *sql.DB, pool *sshpool.Pool, enc *crypto.Encryptor) * } func (r *coreRegistry) RegisterRoute(method, path string, handler http.HandlerFunc, requireAdmin bool) { - r.routes = append(r.routes, RouteEntry{method, path, handler, requireAdmin}) + r.routes = append(r.routes, RouteEntry{Method: method, Path: path, Handler: handler, RequireAdmin: requireAdmin}) +} + +// RegisterPublicRoute enregistre une route sans authentification (ex: page HTML d'un module). +func (r *coreRegistry) RegisterPublicRoute(method, path string, handler http.HandlerFunc) { + r.routes = append(r.routes, RouteEntry{Method: method, Path: path, Handler: handler, Public: true}) } func (r *coreRegistry) RegisterWSChannel(channel string, handler WSHandler) { diff --git a/backend/modules/module.go b/backend/modules/module.go index 64e6e76..4bb5e82 100644 --- a/backend/modules/module.go +++ b/backend/modules/module.go @@ -24,8 +24,10 @@ type NavItemDef struct { // Registry est l'interface exposée aux modules pour s'enregistrer dans le CORE. // Seuls des types de la bibliothèque standard sont exposés — aucun type internal. type Registry interface { - // Enregistrement de routes HTTP + // Enregistrement de routes HTTP (avec authentification) RegisterRoute(method, path string, handler http.HandlerFunc, requireAdmin bool) + // Enregistrement d'une route publique (sans auth — pour les pages HTML) + RegisterPublicRoute(method, path string, handler http.HandlerFunc) // Enregistrement du canal WebSocket RegisterWSChannel(channel string, handler WSHandler) diff --git a/frontend/modules.html b/frontend/modules.html index 67785b8..14b153c 100644 --- a/frontend/modules.html +++ b/frontend/modules.html @@ -111,7 +111,7 @@