Hello guys how are you? Welcome back on my blog Therichpost. Today in this post I am going to share Implementing authorization with roles in Angular 19.
Angular 19 came. If you are new then you must check below two links:
Now guys here is the complete code snippet and please follow carefully:
Implementing authorization with roles in Angular 19 involves several steps, leveraging Angular’s Router Guards, Services, and role-based logic. Below is a detailed guide tailored for Angular 19 with standalone components.
1. Setup Roles and Authentication
Roles are usually provided by your backend service. The user object returned upon login often includes a roles property. For this example:
{
"username": "john_doe",
"roles": ["USER", "ADMIN"]
}
2. Create a Mock Auth Service
The AuthService will handle user authentication and store their roles.
// auth.service.ts
import { Injectable } from '@angular/core';
import { BehaviorSubject, Observable } from 'rxjs';
@Injectable({
providedIn: 'root',
})
export class AuthService {
private currentUserSubject = new BehaviorSubject<any>(null);
constructor() {}
// Simulate a login
login(username: string, password: string): Observable<any> {
const mockUser = {
username,
roles: username === 'admin' ? ['ADMIN'] : ['USER'],
};
this.currentUserSubject.next(mockUser);
return this.currentUserSubject.asObservable();
}
get currentUser(): any {
return this.currentUserSubject.value;
}
logout(): void {
this.currentUserSubject.next(null);
}
hasRole(role: string): boolean {
return this.currentUser?.roles.includes(role);
}
}
3. Implement Role-Based Guard
Use Angular’s Route Guard to check user roles before navigating to routes.
// role.guard.ts
import { Injectable } from '@angular/core';
import {
CanActivate,
Router,
ActivatedRouteSnapshot,
RouterStateSnapshot,
} from '@angular/router';
import { AuthService } from './auth.service';
@Injectable({
providedIn: 'root',
})
export class RoleGuard implements CanActivate {
constructor(private authService: AuthService, private router: Router) {}
canActivate(
route: ActivatedRouteSnapshot,
state: RouterStateSnapshot
): boolean {
const requiredRoles: string[] = route.data['roles'];
const hasAccess = requiredRoles.some((role) =>
this.authService.hasRole(role)
);
if (!hasAccess) {
this.router.navigate(['/unauthorized']); // Redirect if unauthorized
return false;
}
return true;
}
}
4. Define Routes with Roles
In Angular 19, routes can be configured directly in standalone components.
// app.routes.ts
import { Routes } from '@angular/router';
import { RoleGuard } from './role.guard';
export const routes: Routes = [
{
path: 'dashboard',
loadComponent: () =>
import('./dashboard.component').then((m) => m.DashboardComponent),
canActivate: [RoleGuard],
data: { roles: ['USER', 'ADMIN'] }, // Roles required to access this route
},
{
path: 'admin',
loadComponent: () =>
import('./admin.component').then((m) => m.AdminComponent),
canActivate: [RoleGuard],
data: { roles: ['ADMIN'] }, // Only admins can access
},
{
path: 'unauthorized',
loadComponent: () =>
import('./unauthorized.component').then(
(m) => m.UnauthorizedComponent
),
},
];
5. Example Standalone Components
Unauthorized Component
// unauthorized.component.ts
import { Component } from '@angular/core';
import { CommonModule } from '@angular/common';
@Component({
standalone: true,
selector: 'app-unauthorized',
template: `<h1>Unauthorized</h1><p>You do not have access to this page.</p>`,
imports: [CommonModule],
})
export class UnauthorizedComponent {}
Admin Component
// admin.component.ts
import { Component } from '@angular/core';
import { CommonModule } from '@angular/common';
@Component({
standalone: true,
selector: 'app-admin',
template: `<h1>Admin Dashboard</h1>`,
imports: [CommonModule],
})
export class AdminComponent {}
Dashboard Component
// dashboard.component.ts
import { Component } from '@angular/core';
import { CommonModule } from '@angular/common';
@Component({
standalone: true,
selector: 'app-dashboard',
template: `<h1>Dashboard</h1>`,
imports: [CommonModule],
})
export class DashboardComponent {}
6. Bootstrap Application
// main.ts
import { bootstrapApplication } from '@angular/platform-browser';
import { provideRouter } from '@angular/router';
import { routes } from './app.routes';
bootstrapApplication(null, {
providers: [provideRouter(routes)],
}).catch((err) => console.error(err));
7. Secure Role Checks in Templates
You can conditionally display content based on roles:
// app.component.ts
import { Component } from '@angular/core';
import { AuthService } from './auth.service';
import { CommonModule } from '@angular/common';
@Component({
standalone: true,
selector: 'app-root',
template: `
<button (click)="login('user')">Login as User</button>
<button (click)="login('admin')">Login as Admin</button>
<button (click)="logout()">Logout</button>
<div *ngIf="authService.hasRole('USER')">Welcome, User!</div>
<div *ngIf="authService.hasRole('ADMIN')">Welcome, Admin!</div>
`,
imports: [CommonModule],
})
export class AppComponent {
constructor(public authService: AuthService) {}
login(username: string): void {
this.authService.login(username, 'password').subscribe();
}
logout(): void {
this.authService.logout();
}
}
8. Best Practices
- Secure Backend: Always validate roles on the backend for sensitive operations.
- JWT Integration: Use JWT tokens with role claims for production setups.
- Lazy Loading: Lazy-load components for better performance.
Let me know if you need further assistance!
Guys if you will have any kind query then feel free to comment below.
Jassa
Thanks
