{"id":50778344,"url":"https://github.com/thorsten-l/adminlte4-springboot","last_synced_at":"2026-06-12T01:30:28.452Z","repository":{"id":361907390,"uuid":"1256371164","full_name":"thorsten-l/adminlte4-springboot","owner":"thorsten-l","description":null,"archived":false,"fork":false,"pushed_at":"2026-06-01T18:21:09.000Z","size":91,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-01T20:18:38.489Z","etag":null,"topics":["adminlte","adminlte4","demo","java","spring-boot","springboot","springboot4"],"latest_commit_sha":null,"homepage":"","language":"HTML","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/thorsten-l.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-06-01T18:02:01.000Z","updated_at":"2026-06-01T18:24:16.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/thorsten-l/adminlte4-springboot","commit_stats":null,"previous_names":["thorsten-l/adminlte4-springboot"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/thorsten-l/adminlte4-springboot","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thorsten-l%2Fadminlte4-springboot","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thorsten-l%2Fadminlte4-springboot/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thorsten-l%2Fadminlte4-springboot/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thorsten-l%2Fadminlte4-springboot/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/thorsten-l","download_url":"https://codeload.github.com/thorsten-l/adminlte4-springboot/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thorsten-l%2Fadminlte4-springboot/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34225350,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-11T02:00:06.485Z","response_time":57,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["adminlte","adminlte4","demo","java","spring-boot","springboot","springboot4"],"created_at":"2026-06-12T01:30:27.691Z","updated_at":"2026-06-12T01:30:28.426Z","avatar_url":"https://github.com/thorsten-l.png","language":"HTML","funding_links":[],"categories":[],"sub_categories":[],"readme":"# AdminLTE 4 + Spring Boot 4 Demo\n\nDemo-Anwendung, die das **AdminLTE 4** UI-Template in einer **Spring Boot 4** /\n**Thymeleaf**-Applikation mit **OAuth2 Login** gegen einen lokalen\n**Keycloak** verwendet.\n\nAlle AdminLTE-Assets und Vendor-Bibliotheken werden als **WebJars** über\n`/webjars/**` ausgeliefert — es gibt keine eingecheckten Static-Assets und\nkeinen Frontend-Build-Schritt. CDN-Verweise wurden vollständig durch lokale\nWebJars ersetzt, die App läuft damit komplett offline.\n\n## Voraussetzungen\n\n- JDK **21 LTS**\n- Maven 3.9+ (oder der beigelegte `./mvnw`-Wrapper)\n- Docker (für Keycloak)\n\n## Setup\n\n### 1. Keycloak starten\n\n```bash\ndocker compose up -d\n```\n\nKeycloak ist dann unter \u003chttp://localhost:8180\u003e erreichbar\n(Admin-Konsole: `admin` / `admin`). Beim ersten Start wird der Realm\n`adminlte-demo` aus `keycloak/adminlte-demo-realm.json` importiert.\n\nVorab angelegt:\n\n- **Realm:** `adminlte-demo`\n- **Client:** `adminlte-springboot` (Confidential, Standard Flow)\n- **Client Secret:** `change-me-in-keycloak` (im Realm-Export gesetzt)\n- **Redirect URI:** `http://localhost:8080/login/oauth2/code/keycloak`\n- **Demo-User:** `demo` / `demo`\n\n\u003e Für eine echte Umgebung **unbedingt** Secret + User-Passwort über die\n\u003e Keycloak-Admin-Konsole rotieren.\n\n### 2. Anwendung starten\n\n```bash\n./mvnw spring-boot:run\n# oder\nmvn spring-boot:run\n```\n\nApp: \u003chttp://localhost:8080\u003e\n\nÜber *Login* in der Topbar oder den Button auf der Startseite startet der\nOIDC-Flow gegen Keycloak. Nach Login zeigt `/dashboard` ein paar\nAdminLTE-Widgets sowie die OIDC-Claims des angemeldeten Users.\n\n## Demo-Seiten\n\nNeben dem geschützten `/dashboard` sind zahlreiche AdminLTE-Demo-Seiten als\n**öffentlich erreichbare** Thymeleaf-Templates portiert (siehe `permitAll` in\n`SecurityConfig` und das Routing in `WebMvcConfig`):\n\n| Bereich | Routen |\n|---|---|\n| Dashboards | `/dashboard/v2`, `/dashboard/v3` |\n| Theme-Generator | `/generate/theme` |\n| Widgets | `/widgets/{small-box,info-box,cards}` |\n| Layout-Varianten | `/layout/{unfixed-sidebar,fixed-sidebar,fixed-header,fixed-footer,fixed-complete,layout-custom-area,sidebar-mini,collapsed-sidebar,collapsed-sidebar-without-hover,logo-switch,layout-rtl}` |\n| UI-Elemente | `/UI/{general,icons,timeline}` |\n| Mailbox | `/mailbox/{inbox,read,compose}` |\n| Formulare | `/forms/{elements,layout,validation,wizard}` |\n| Tabellen | `/tables/{simple,data}` |\n| Seiten | `/pages/{profile,settings,invoice,calendar,kanban,chat,file-manager,projects,pricing,faq,404,500,maintenance}` |\n| Auth-Beispiele | `/examples/{login,register,login-v2,register-v2,lockscreen}` |\n\nDiese Seiten sind reine Layout-/Routing-Mappings über `WebMvcConfig` und\nbenötigen keinen eigenen Controller.\n\n## Konfiguration\n\nSensible Werte lassen sich per Umgebungsvariable überschreiben:\n\n| Variable | Default | Bedeutung |\n|---|---|---|\n| `KEYCLOAK_CLIENT_SECRET` | `change-me-in-keycloak` | Secret des Keycloak-Clients |\n\nWeitere relevante Defaults aus `application.yml`:\n\n- App-Port `8080`, `forward-headers-strategy: framework` (für Reverse-Proxy-Setups)\n- Keycloak-Issuer `http://localhost:8180/realms/adminlte-demo`\n- `spring.thymeleaf.cache: false` (nur für Entwicklung)\n\n## Frontend-Assets (WebJars)\n\nAdminLTE und alle Vendor-Libs kommen als Maven-Dependencies und werden unter\n`/webjars/\u003cartifactId\u003e/\u003cpfad\u003e` ausgeliefert. Dank `webjars-locator-lite`\nreferenzieren die Templates **versionslos**, z. B.:\n\n```html\n\u003clink rel=\"stylesheet\" th:href=\"@{/webjars/adminlte/css/adminlte.min.css}\"/\u003e\n\u003cscript th:src=\"@{/webjars/bootstrap/js/bootstrap.min.js}\"\u003e\u003c/script\u003e\n```\n\nVerwendete WebJars (Versionen in `pom.xml`):\n\n- **In-house** (`de.l9g.webjars`): `adminlte` 4.0.0, `jsvectormap` 1.5.3,\n  `source-sans-3` 5.0.12\n- **Public**: `bootstrap` 5.3.8, `popperjs__core` 2.11.8, `bootstrap-icons`\n  1.13.1, `overlayscrollbars` 2.11.4, `apexcharts` 3.54.1, `sortablejs` 1.15.0,\n  `fullcalendar` 6.1.15, `tabulator-tables` 6.3.1\n\n\u003e AdminLTE 4 wird hier als eigenes WebJar (`de.l9g.webjars:adminlte`)\n\u003e bereitgestellt, da es kein offizielles AdminLTE-4-WebJar gibt.\n\n## Projektstruktur\n\n```\nadminlte4-springboot/\n├── pom.xml                              # Spring Boot 4, WebJar-Dependencies\n├── docker-compose.yml                   # Keycloak 26 (Port 8180)\n├── keycloak/adminlte-demo-realm.json    # Realm + Client + Demo-User\n└── src/\n    ├── main/java/com/example/adminltedemo/\n    │   ├── AdminLteDemoApplication.java\n    │   ├── config/\n    │   │   ├── SecurityConfig.java      # OAuth2 Login + RP-initiated Logout\n    │   │   └── WebMvcConfig.java        # View-Controller für die Demo-Seiten\n    │   └── web/HomeController.java       # \"/\" und \"/dashboard\"\n    ├── main/resources/\n    │   ├── application.yml              # OAuth2 Client → Keycloak\n    │   └── templates/\n    │       ├── layout/main.html         # AdminLTE-Grundlayout (Layout-Dialect)\n    │       ├── layout/blank.html        # Layout ohne Sidebar (Auth-Seiten)\n    │       ├── fragments/{header,sidebar,footer}.html\n    │       ├── index.html  dashboard.html\n    │       └── {dashboard,widgets,layout,UI,mailbox,forms,\n    │            tables,pages,examples,generate,error}/…  # Demo-Seiten\n    └── test/java/com/example/adminltedemo/\n        └── SmokeTest.java               # Kontext-Start + \"/\" erreichbar\n```\n\n## Hinweise\n\n- AdminLTE-CSS/JS und alle Vendor-Libs werden unter `/webjars/**` ausgeliefert\n  (`SecurityConfig` lässt diesen Pfad permitAll).\n- Logout ist **RP-initiated OIDC Logout** — nach `/logout` wird auch die\n  Keycloak-Session beendet; danach Redirect auf `/`.\n- Nach erfolgreichem Login wird per `defaultSuccessUrl(\"/dashboard\", true)`\n  immer auf `/dashboard` weitergeleitet.\n- Dark Mode nutzt Bootstrap 5.3 `data-bs-theme` (Light/Dark/Auto-Umschaltung in\n  der Topbar, Auswahl wird in `localStorage` unter `lte-theme` gespeichert).\n- `spring.thymeleaf.cache: false` ist nur für die Entwicklung sinnvoll; in\n  Produktion über ein eigenes Profil aktivieren.\n- Der Smoke-Test mockt das `ClientRegistrationRepository`, damit der Kontext\n  ohne laufenden Keycloak hochfährt.\n```\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fthorsten-l%2Fadminlte4-springboot","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fthorsten-l%2Fadminlte4-springboot","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fthorsten-l%2Fadminlte4-springboot/lists"}