From fe8b1a1399f0ade2ad27e52720a1c69c0614dbbd Mon Sep 17 00:00:00 2001 From: Jan Klattenhoff Date: Wed, 18 Dec 2024 14:06:19 +0100 Subject: [PATCH] feat: add Keycloak authentication integration and guard --- bun.lockb | Bin 404415 -> 405333 bytes package.json | 1 + public/silent-check-sso.html | 3 ++ src/app/app.config.ts | 43 +++++++++++++++++- src/app/app.routes.ts | 7 +++ .../login-view/login-view.component.ts | 2 +- src/app/service/auth.service.ts | 42 +++++++++++++++++ 7 files changed, 95 insertions(+), 3 deletions(-) create mode 100644 public/silent-check-sso.html create mode 100644 src/app/service/auth.service.ts diff --git a/bun.lockb b/bun.lockb index a4ad67b2b8169170d52f29398ba50d60df8aabae..6fd82b0fc061f925fc26bd880001cc97d81384cd 100755 GIT binary patch delta 81039 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 diff --git a/package.json b/package.json index 232ef91..f1859dd 100644 --- a/package.json +++ b/package.json @@ -19,6 +19,7 @@ "@angular/platform-browser-dynamic": "^18.2.0", "@angular/router": "^18.2.0", "bootstrap": "^5.3.3", + "keycloak-angular": "^16.1.0", "rxjs": "~7.8.0", "tslib": "^2.3.0", "zone.js": "~0.14.10" diff --git a/public/silent-check-sso.html b/public/silent-check-sso.html new file mode 100644 index 0000000..75b40d3 --- /dev/null +++ b/public/silent-check-sso.html @@ -0,0 +1,3 @@ + +

balls

+ diff --git a/src/app/app.config.ts b/src/app/app.config.ts index a1e7d6f..b047b4b 100644 --- a/src/app/app.config.ts +++ b/src/app/app.config.ts @@ -1,8 +1,47 @@ -import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core'; +import { APP_INITIALIZER, ApplicationConfig, provideZoneChangeDetection } from '@angular/core'; import { provideRouter } from '@angular/router'; import { routes } from './app.routes'; +import {KeycloakAngularModule, KeycloakBearerInterceptor, KeycloakService} from "keycloak-angular"; +import { HTTP_INTERCEPTORS, provideHttpClient, withInterceptorsFromDi } from '@angular/common/http'; + +export const initializeKeycloak = (keycloak: KeycloakService) => async () => + keycloak.init({ + config: { + url: 'https://keycloak.szut.dev/auth', + realm: 'szut', + clientId: 'employee-management-service-frontend', + }, + loadUserProfileAtStartUp: true, + initOptions: { + onLoad: 'check-sso', + silentCheckSsoRedirectUri: + window.location.origin + '/silent-check-sso.html', + checkLoginIframe: false, + redirectUri: 'http://localhost:4200', + }, + }); + +function initializeApp(keycloak: KeycloakService): () => Promise { + return () => initializeKeycloak(keycloak)(); +} export const appConfig: ApplicationConfig = { - providers: [provideZoneChangeDetection({ eventCoalescing: true }), provideRouter(routes)] + providers: [ + provideRouter(routes), + KeycloakAngularModule, + { + provide: APP_INITIALIZER, + useFactory: initializeApp, + multi: true, + deps: [KeycloakService] + }, + KeycloakService, + provideHttpClient(withInterceptorsFromDi()), + { + provide: HTTP_INTERCEPTORS, + useClass: KeycloakBearerInterceptor, + multi: true + } + ] }; diff --git a/src/app/app.routes.ts b/src/app/app.routes.ts index ae2c715..7f0657d 100644 --- a/src/app/app.routes.ts +++ b/src/app/app.routes.ts @@ -3,6 +3,8 @@ import { LoginViewComponent } from './components/login-view/login-view.component import { MitarbeiterverwaltungViewComponent } from './components/mitarbeiterverwaltung-view/mitarbeiterverwaltung-view.component'; import { EmployeeDetailComponent } from './components/employee-detail/employee-detail.component'; import { QualifikatonBearbeitenViewComponent } from './components/qualifikaton-bearbeiten-view/qualifikaton-bearbeiten-view.component'; +import { KeycloakAuthGuard } from 'keycloak-angular'; +import { AuthGuard } from './service/auth.service'; export const routes: Routes = [ { @@ -12,6 +14,7 @@ export const routes: Routes = [ { path: "mitarbeiter", component: MitarbeiterverwaltungViewComponent, + canActivate: [AuthGuard], }, { path: "mitarbeiterdetails", @@ -20,5 +23,9 @@ export const routes: Routes = [ { path: "qualifikationbearbeiten", component: QualifikatonBearbeitenViewComponent, + }, + { + path: "**", + redirectTo: '', } ]; diff --git a/src/app/components/login-view/login-view.component.ts b/src/app/components/login-view/login-view.component.ts index ffc3ab9..9e9655e 100644 --- a/src/app/components/login-view/login-view.component.ts +++ b/src/app/components/login-view/login-view.component.ts @@ -1,4 +1,5 @@ import { Component } from '@angular/core'; +import { KeycloakService } from 'keycloak-angular'; @Component({ selector: 'app-login-view', @@ -8,5 +9,4 @@ import { Component } from '@angular/core'; styleUrl: './login-view.component.css' }) export class LoginViewComponent { - } diff --git a/src/app/service/auth.service.ts b/src/app/service/auth.service.ts new file mode 100644 index 0000000..0179ce9 --- /dev/null +++ b/src/app/service/auth.service.ts @@ -0,0 +1,42 @@ +import { Injectable } from '@angular/core'; +import { + ActivatedRouteSnapshot, + Router, + RouterStateSnapshot +} from '@angular/router'; +import { KeycloakAuthGuard, KeycloakService } from 'keycloak-angular'; + +@Injectable({ + providedIn: 'root' +}) +export class AuthGuard extends KeycloakAuthGuard { + constructor( + protected override readonly router: Router, + protected readonly keycloak: KeycloakService + ) { + super(router, keycloak); + } + + public async isAccessAllowed( + route: ActivatedRouteSnapshot, + state: RouterStateSnapshot + ) { + // Force the user to log in if currently unauthenticated. + if (!this.authenticated) { + await this.keycloak.login({ + redirectUri: window.location.origin + state.url + }); + } + + // Get the roles required from the route. + const requiredRoles = route.data['roles']; + + // Allow the user to proceed if no additional roles are required to access the route. + if (!Array.isArray(requiredRoles) || requiredRoles.length === 0) { + return true; + } + + // Allow the user to proceed if all the required roles are present. + return requiredRoles.every((role) => this.roles.includes(role)); + } +}