75 lines
2.1 KiB
TypeScript
75 lines
2.1 KiB
TypeScript
import { inject } from '@angular/core';
|
|
import {
|
|
ActivatedRouteSnapshot,
|
|
CanActivateFn,
|
|
Router,
|
|
RouterStateSnapshot,
|
|
Routes,
|
|
UrlTree,
|
|
} from '@angular/router';
|
|
import { AuthGuardData, createAuthGuard } from 'keycloak-angular';
|
|
import { Login } from './components/login/login';
|
|
import { MissingPage } from './components/missing-page/missing-page';
|
|
import { Claim } from './generated-api/api';
|
|
|
|
export const roles = {
|
|
UserAdmin: 'useradmin',
|
|
MemberAdmin: 'memberadmin',
|
|
};
|
|
|
|
function requireRoles(
|
|
roles: string[] = [],
|
|
any: boolean = false,
|
|
): CanActivateFn {
|
|
const isAllowed = async (
|
|
_: ActivatedRouteSnapshot,
|
|
__: RouterStateSnapshot,
|
|
authData: AuthGuardData,
|
|
): Promise<boolean | UrlTree> => {
|
|
const { authenticated, grantedRoles } = authData;
|
|
const allRoles = Object.values(grantedRoles).flat();
|
|
|
|
const hasRequiredRoles = any
|
|
? roles.some(role => allRoles.includes(role))
|
|
: roles.every(role => allRoles.includes(role));
|
|
|
|
if (authenticated && hasRequiredRoles) {
|
|
return true;
|
|
}
|
|
const router = inject(Router);
|
|
return router.parseUrl('/login');
|
|
};
|
|
|
|
return createAuthGuard<CanActivateFn>(isAllowed);
|
|
}
|
|
|
|
export const routes: Routes = [
|
|
{ path: 'login', component: Login },
|
|
{
|
|
path: '',
|
|
loadComponent: () =>
|
|
import('./components/home/home').then(mod => mod.Home),
|
|
canActivate: [requireRoles()],
|
|
},
|
|
{
|
|
path: 'home',
|
|
loadComponent: () =>
|
|
import('./components/home/home').then(mod => mod.Home),
|
|
canActivate: [requireRoles()],
|
|
},
|
|
{
|
|
path: 'test',
|
|
loadComponent: () =>
|
|
import('./components/test/test').then(mod => mod.Test),
|
|
},
|
|
{
|
|
path: 'list',
|
|
loadComponent: () =>
|
|
import('./components/view-members/view-members').then(
|
|
mod => mod.ViewMembers,
|
|
),
|
|
canActivate: [requireRoles([Claim.Memberadmin])],
|
|
},
|
|
{ path: '**', component: MissingPage },
|
|
];
|