Ajout auth

This commit is contained in:
2026-05-24 06:50:13 +02:00
parent 13958be53e
commit 2098da0630
8 changed files with 81 additions and 10 deletions
+5
View File
@@ -23,6 +23,11 @@
{ {
"glob": "**/*", "glob": "**/*",
"input": "public" "input": "public"
},
{
"glob": "**/*",
"input": "src/assets",
"output": "assets"
} }
], ],
"styles": [ "styles": [
+12 -2
View File
@@ -1,12 +1,12 @@
{ {
"name": "bonsai-webapp", "name": "bonsai-webapp",
"version": "0.0.0", "version": "0.1.0",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "bonsai-webapp", "name": "bonsai-webapp",
"version": "0.0.0", "version": "0.1.0",
"dependencies": { "dependencies": {
"@angular/common": "^21.2.0", "@angular/common": "^21.2.0",
"@angular/compiler": "^21.2.0", "@angular/compiler": "^21.2.0",
@@ -15,6 +15,7 @@
"@angular/platform-browser": "^21.2.0", "@angular/platform-browser": "^21.2.0",
"@angular/router": "^21.2.0", "@angular/router": "^21.2.0",
"bootstrap": "^5.3.3", "bootstrap": "^5.3.3",
"keycloak-js": "^26.2.4",
"marked": "^18.0.4", "marked": "^18.0.4",
"rxjs": "~7.8.0", "rxjs": "~7.8.0",
"tslib": "^2.3.0" "tslib": "^2.3.0"
@@ -6072,6 +6073,15 @@
], ],
"license": "MIT" "license": "MIT"
}, },
"node_modules/keycloak-js": {
"version": "26.2.4",
"resolved": "https://registry.npmjs.org/keycloak-js/-/keycloak-js-26.2.4.tgz",
"integrity": "sha512-PnXpR3ubETGOt0B/Qt2lxmPbkZr5bc3vlQsOqDoTPPQsZRp7JjhTKxlJ187uWh8qJhvBab6Gsjb06a8ayOPfuw==",
"license": "Apache-2.0",
"workspaces": [
"test"
]
},
"node_modules/listr2": { "node_modules/listr2": {
"version": "9.0.5", "version": "9.0.5",
"resolved": "https://registry.npmjs.org/listr2/-/listr2-9.0.5.tgz", "resolved": "https://registry.npmjs.org/listr2/-/listr2-9.0.5.tgz",
+1
View File
@@ -18,6 +18,7 @@
"@angular/platform-browser": "^21.2.0", "@angular/platform-browser": "^21.2.0",
"@angular/router": "^21.2.0", "@angular/router": "^21.2.0",
"bootstrap": "^5.3.3", "bootstrap": "^5.3.3",
"keycloak-js": "^26.2.4",
"marked": "^18.0.4", "marked": "^18.0.4",
"rxjs": "~7.8.0", "rxjs": "~7.8.0",
"tslib": "^2.3.0" "tslib": "^2.3.0"
+7 -2
View File
@@ -1,8 +1,13 @@
import { ApplicationConfig, provideBrowserGlobalErrorListeners } from '@angular/core'; import { ApplicationConfig, inject, provideBrowserGlobalErrorListeners, provideAppInitializer } from '@angular/core';
import { provideRouter } from '@angular/router'; import { provideRouter } from '@angular/router';
import { routes } from './app.routes'; import { routes } from './app.routes';
import { KeycloakService } from './auth/keycloak.service';
export const appConfig: ApplicationConfig = { export const appConfig: ApplicationConfig = {
providers: [provideBrowserGlobalErrorListeners(), provideRouter(routes)], providers: [
provideBrowserGlobalErrorListeners(),
provideRouter(routes),
provideAppInitializer(() => inject(KeycloakService).init()),
],
}; };
+5 -4
View File
@@ -3,14 +3,15 @@ import { Home } from './home/home';
import { IssueDetail } from './issues/issue-detail/issue-detail'; import { IssueDetail } from './issues/issue-detail/issue-detail';
import { Issues } from './issues/issues'; import { Issues } from './issues/issues';
import { Projects } from './projects/projects'; import { Projects } from './projects/projects';
import { authGuard } from './auth/auth.guard';
export const routes: Routes = [ export const routes: Routes = [
{ path: '', pathMatch: 'full', redirectTo: 'home' }, { path: '', pathMatch: 'full', redirectTo: 'home' },
{ path: 'home', component: Home }, { path: 'home', component: Home },
{ path: 'project', component: Projects }, { path: 'project', component: Projects, canActivate: [authGuard] },
{ path: 'projects', redirectTo: 'project' }, { path: 'projects', redirectTo: 'project' },
{ path: 'issues/new', component: IssueDetail }, { path: 'issues/new', component: IssueDetail, canActivate: [authGuard] },
{ path: 'issues/:id', component: IssueDetail }, { path: 'issues/:id', component: IssueDetail, canActivate: [authGuard] },
{ path: 'issues', component: Issues }, { path: 'issues', component: Issues, canActivate: [authGuard] },
{ path: '**', redirectTo: 'home' }, { path: '**', redirectTo: 'home' },
]; ];
+37 -1
View File
@@ -64,8 +64,44 @@
font-weight: 600; font-weight: 600;
} }
.sidebar-footer { .sidebar-user {
display: flex;
flex-direction: column;
gap: 0.4rem;
padding: 0.6rem 0.75rem;
border-top: 1px solid #e5e7eb;
margin-top: auto; margin-top: auto;
}
.sidebar-user-name {
font-size: 0.85rem;
font-weight: 600;
color: #374151;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.sidebar-logout {
width: 100%;
padding: 0.35rem 0.5rem;
font-size: 0.8rem;
font-weight: 500;
color: #6b7280;
background: transparent;
border: 1px solid #d1d5db;
border-radius: 0.375rem;
cursor: pointer;
transition: background 0.1s, color 0.1s, border-color 0.1s;
}
.sidebar-logout:hover {
background: #fee2e2;
color: #dc2626;
border-color: #fca5a5;
}
.sidebar-footer {
padding: 0 0.5rem; padding: 0 0.5rem;
font-size: 0.72rem; font-size: 0.72rem;
color: #9ca3af; color: #9ca3af;
+7
View File
@@ -40,5 +40,12 @@
} }
</nav> </nav>
@if (keycloak.isAuthenticated()) {
<div class="sidebar-user">
<span class="sidebar-user-name">{{ keycloak.username() }}</span>
<button class="sidebar-logout" (click)="logout()">Déconnexion</button>
</div>
}
<footer class="sidebar-footer">v{{ version }}</footer> <footer class="sidebar-footer">v{{ version }}</footer>
</aside> </aside>
+7 -1
View File
@@ -1,6 +1,7 @@
import { Component } from '@angular/core'; import { Component, inject } from '@angular/core';
import { RouterLink, RouterLinkActive } from '@angular/router'; import { RouterLink, RouterLinkActive } from '@angular/router';
import { version } from '../../../package.json'; import { version } from '../../../package.json';
import { KeycloakService } from '../auth/keycloak.service';
@Component({ @Component({
selector: 'app-menu', selector: 'app-menu',
@@ -10,10 +11,15 @@ import { version } from '../../../package.json';
}) })
export class Menu { export class Menu {
protected readonly version = version; protected readonly version = version;
protected readonly keycloak = inject(KeycloakService);
protected readonly menuItems = [ protected readonly menuItems = [
{ label: 'Accueil', path: '/home' }, { label: 'Accueil', path: '/home' },
{ label: 'Projet', path: '/project' }, { label: 'Projet', path: '/project' },
{ label: 'Issues', path: '/issues' }, { label: 'Issues', path: '/issues' },
]; ];
protected logout(): void {
this.keycloak.logout();
}
} }