Angular-এ গার্ডস (Guards) হলো এমন একটি ফিচার যা রাউট পরিবর্তনের আগে কিছু শর্ত যাচাই করে। এটি ব্যবহারকারীর অ্যাপ্লিকেশনে একটি নির্দিষ্ট রাউট বা পেজে প্রবেশের অনুমতি প্রদান বা বাধা দেয়। Angular-এ বিভিন্ন ধরনের গার্ড রয়েছে, যেমন CanActivate, CanDeactivate, CanLoad, Resolve, CanActivateChild ইত্যাদি, এবং এগুলি রাউট নিরাপত্তা এবং নিয়ন্ত্রণে গুরুত্বপূর্ণ ভূমিকা পালন করে।
CanActivate গার্ডটি একটি রাউট এক্সেস করার আগে রিটার্ন করা একটি শর্ত চেক করে। যদি শর্তটি পূর্ণ হয়, তবে রাউটটি অ্যাক্সেস করা যাবে, নতুবা ব্যবহারকারী অন্য কোথাও রিডিরেক্ট হবে। এটি সাধারণত ইউজার অথেনটিকেশন বা অথোরাইজেশনের জন্য ব্যবহৃত হয়।
ব্যবহার উদাহরণ:
import { Injectable } from '@angular/core';
import { CanActivate, Router } from '@angular/router';
import { Observable } from 'rxjs';
@Injectable({
providedIn: 'root'
})
export class AuthGuard implements CanActivate {
constructor(private router: Router) {}
canActivate(): Observable<boolean> | Promise<boolean> | boolean {
// Example: Check if user is logged in
if (localStorage.getItem('userLoggedIn')) {
return true;
} else {
this.router.navigate(['/login']);
return false;
}
}
}
এখানে, AuthGuard
গার্ডটি ইউজার যদি লগইন না করে থাকে তবে /login
পেজে রিডিরেক্ট করবে।
CanDeactivate গার্ডটি তখন ব্যবহার করা হয় যখন একটি ব্যবহারকারী কোনো কম্পোনেন্ট থেকে অন্য কম্পোনেন্টে যেতে চায়, এবং আপনি চাইলে তার আগে কিছু নিশ্চিতকরণ (confirmation) বা শর্ত পরীক্ষা করতে পারেন। এটি সাধারণত ফর্ম সাবমিশন বা পেজের পরিবর্তন পূর্বে কোনো সতর্কীকরণ দেখানোর জন্য ব্যবহৃত হয়।
ব্যবহার উদাহরণ:
import { Injectable } from '@angular/core';
import { CanDeactivate } from '@angular/router';
import { Observable } from 'rxjs';
export interface CanComponentDeactivate {
canDeactivate: () => Observable<boolean> | Promise<boolean> | boolean;
}
@Injectable({
providedIn: 'root'
})
export class UnsavedChangesGuard implements CanDeactivate<CanComponentDeactivate> {
canDeactivate(component: CanComponentDeactivate): Observable<boolean> | Promise<boolean> | boolean {
return component.canDeactivate ? component.canDeactivate() : true;
}
}
এখানে, CanComponentDeactivate
ইন্টারফেসটি সুনির্দিষ্টভাবে canDeactivate()
মেথডের জন্য কন্ট্রোল প্রদান করে, যা ফর্ম বা পেজের পরিবর্তন পূর্বে যাচাই করবে।
Resolve গার্ডটি ব্যবহার করা হয় রাউটটি অ্যাক্সেস করার আগে কিছু ডেটা লোড করার জন্য। এটি একটি অ্যাসিনক্রোনাস অপারেশন যেমন HTTP রিকোয়েস্ট সম্পন্ন করার আগে রাউটটি রেন্ডার হতে দেয় না। এটি সাধারণত রাউট রিজলভ ডেটা বা সাইন-আপ/লগইন ফর্ম পূর্ণ করতে ব্যবহৃত হয়।
ব্যবহার উদাহরণ:
import { Injectable } from '@angular/core';
import { Resolve, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';
import { Observable } from 'rxjs';
import { DataService } from './data.service';
@Injectable({
providedIn: 'root'
})
export class DataResolver implements Resolve<any> {
constructor(private dataService: DataService) {}
resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<any> {
return this.dataService.fetchData();
}
}
এখানে, DataResolver
গার্ডটি ব্যবহারকারীকে একটি রাউট অ্যাক্সেস করার আগে প্রয়োজনীয় ডেটা সরবরাহ করবে (যেমন API রিকোয়েস্টের মাধ্যমে ডেটা রিটার্ন করা)।
CanLoad গার্ডটি ব্যবহার করা হয় লেজি-লোডেড মডিউল লোড হওয়ার আগে শর্ত যাচাই করার জন্য। এটি মূলত তখন ব্যবহার হয়, যখন আপনি চান শুধুমাত্র নির্দিষ্ট ইউজাররা কিছু মডিউল অ্যাক্সেস করতে পারবে। এটি মডিউল লোড করার পূর্বে শর্ত চেক করে।
ব্যবহার উদাহরণ:
import { Injectable } from '@angular/core';
import { CanLoad, Route, UrlSegment, Router } from '@angular/router';
import { Observable } from 'rxjs';
@Injectable({
providedIn: 'root'
})
export class AdminGuard implements CanLoad {
constructor(private router: Router) {}
canLoad(route: Route, segments: UrlSegment[]): Observable<boolean> | Promise<boolean> | boolean {
if (localStorage.getItem('userRole') === 'admin') {
return true;
} else {
this.router.navigate(['/not-authorized']);
return false;
}
}
}
এখানে, AdminGuard
গার্ডটি নিশ্চিত করবে যে শুধুমাত্র admin
রোলধারী ইউজাররা নির্দিষ্ট মডিউল লোড করতে পারবে।
CanActivateChild গার্ডটি মূলত একটি প্যারেন্ট রাউটের অধীনে থাকা চাইল্ড রাউটগুলোর জন্য ব্যবহৃত হয়। এটি চাইল্ড রাউটের জন্য কিছু শর্ত যাচাই করে প্যারেন্ট রাউটের অধীনে চাইল্ড রাউট এক্সেস করার অনুমতি দেয় বা বাধা দেয়।
ব্যবহার উদাহরণ:
import { Injectable } from '@angular/core';
import { CanActivateChild, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';
import { Observable } from 'rxjs';
@Injectable({
providedIn: 'root'
})
export class ChildGuard implements CanActivateChild {
canActivateChild(
route: ActivatedRouteSnapshot,
state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean {
// Check some condition for child route access
return true;
}
}
এখানে, ChildGuard
গার্ডটি চেক করবে যে প্যারেন্ট রাউটের অধীনে চাইল্ড রাউট অ্যাক্সেস করা যাবে কিনা।
Angular গার্ডস বিভিন্ন পরিস্থিতিতে রাউটের অ্যাক্সেস নিয়ন্ত্রণ করতে ব্যবহৃত হয়, এবং এর বিভিন্ন প্রকার (CanActivate, CanDeactivate, Resolve, CanLoad, CanActivateChild) অ্যাপ্লিকেশন নিরাপত্তা এবং ডেটা লোডিংয়ের জন্য অত্যন্ত গুরুত্বপূর্ণ। এগুলি ব্যবহারের মাধ্যমে আপনি ইউজার ইন্টারঅ্যাকশন এবং অ্যাপ্লিকেশন ফ্লো নিয়ন্ত্রণ করতে পারেন।