תחי ישראל - אין לנו ארץ אחרת

תחי ישראל -אין לנו ארץ אחרת

מניעת גישה מנתיבים באפליקציה של Angular באמצעות canActivate

מחבר:
בתאריך:

במדריך הקודם למדנו לעבוד עם נתיבים (דפים) באפליקציה האנגולרית באמצעות routing, אבל כיצד נמנע מהמשתמשים באפליקציה כניסה לדפים מסוימים? לדוגמה, כיצד נתיר גישה לדפים מסוימים רק למשתמש מזוהה שעשה לוגאין. לצורך כך, נשתמש ב- CanActivate Guard. ה- guard הוא service.

 

צעד 1: נוסיף את קובץ ה-guard

ניצור קובץ auth.guard בתיקיית השורש של האפליקציה:

/src/app/auth.guard.ts
------------------------------
import { CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';

export class AuthGuard implements CanActivate {
   canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {
   return true;
  }
}
  • הקלאס מיישם את interface ששמו CanActivate שאותו אנו מייבאים מ-angular/router.
  • כדי ליישם את ה-interface, הקלאס חייב לכלול מתודה canActivate שמקבלת שני פרמטרים:
    ActivatedRouteSnapshot
    RouterStateSnapshot
  • מהיכן מגיעים הפרמטרים? Angular טוען את ה-guard לפני שנכנסים לנתיב, ומספק לו את הפרמטרים.
  • המתודה צפויה להחזיר בוליאני. תחזיר true במקרה שהמשתמש רשאי להיכנס, ו-false שימנע כניסה של המשתמש.

 

צעד 2: נוסיף את ה-guard לרשימת ה-providers של האפליקציה

app.module.ts
-------------------
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';

import { AppComponent } from './app.component';
import { FormsModule } from '@angular/forms';

import { AppRoutingModule } from './app-routing.module';

import { CarService } from './car.service';

import { HomeComponent } from './home/home.component';
import { CarsComponent } from './cars/cars.component';
import { CarComponent } from './cars/car/car.component';

import { PageNotFoundComponent } from './page-not-found/page-not-found.component';
import { CarsEditComponent } from './cars/cars-edit/cars-edit.component';

import { AuthGuard } from './auth.guard';

@NgModule({
  declarations: [
    AppComponent,
    HomeComponent,
    PageNotFoundComponent,
    CarsComponent,
    CarComponent,
    CarsEditComponent
  ],
  imports: [
    BrowserModule,
    AppRoutingModule,
    FormsModule
  ],
  providers: [CarService,AuthGuard],
  bootstrap: [AppComponent]
})
export class AppModule { }

מכיוון שה-guard הוא service נייבא אותו לתוך ה-providers.

 

צעד 3: service שאחראי לזיהוי המשתמשים

ניצור service כדי לנהל את המשתמשים, ולהבחין בין משתמש שנכנס למערכת לבין מי שאינו מזוהה.

/src/app/auth.service.ts
-------------------------------
export class AuthService {
    loggedIn = false;

    isAuth(){
        return loggedIn;
    }
}

המתודה isAuth מחזירה את הערך של המשתנה loggedIn שאומר לנו האם המשתמש מזוהה במערכת.

 

צעד 4: נחבר את ה-services עם האפליקציה

/src/app/app.module.ts
------------------
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';

import { AppComponent } from './app.component';
import { FormsModule } from '@angular/forms';

import { AppRoutingModule } from './app-routing.module';

import { CarService } from './car.service';

import { HomeComponent } from './home/home.component';
import { CarsComponent } from './cars/cars.component';
import { CarComponent } from './cars/car/car.component';

import { PageNotFoundComponent } from './page-not-found/page-not-found.component';
import { CarsEditComponent } from './cars/cars-edit/cars-edit.component';

import { AuthService } from './auth.service';
import { AuthGuard } from './auth.guard';

@NgModule({
  declarations: [
    AppComponent,
    HomeComponent,
    PageNotFoundComponent,
    CarsComponent,
    CarComponent,
    CarsEditComponent
  ],
  imports: [
    BrowserModule,
    AppRoutingModule,
    FormsModule
  ],
  providers: [CarService,AuthService,AuthGuard],
  bootstrap: [AppComponent]
})
export class AppModule { }

לא מספיק לייבא את ה-services, צריך להוסיף אותם לרשימת ה-providers.

 

צעד 5: נזריק ל-guard את הקלאס שממנו הוא יקבל מידע

איך ה-guard ידע להבחין בין משתמש מזוהה ולא מזוהה? הוא צריך לקבל מידע מ-AuthService. לכן נזריק את ה-AuthService ל-guard.

/src/app/auth.guard.ts
-----------------------------
import { Injectable } from '@angular/core';
import { CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';

import { AuthService } from './auth.service';
@Injectable()
export class AuthGuard implements CanActivate {
   canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {
       return true;
   }
}

הדקורטור Injectable מאפשר לקלאס לקבל מידע מקלאסים אחרים. באפליקציה שלנו, אנחנו מעוניינים לדעת האם המשתמש מזוהה, ולכן אנחנו צריכים לייבא את ה-AuthService אל תוך ה-guard.

אחרי שייבאנו את ה-AuthService אנחנו יכולים לבדוק באמצעותו האם המשתמש מזוהה. אם המשתמש מזוהה נחזיר true, ואם אינו מזוהה נפנה אותו לדף הבית.

/src/app/auth.guard.ts
-----------------------------
import { CanActivate } from '@angular/router';

import { Injectable } from '@angular/core';
import { AuthService } from './auth-service';
import { Router } from '@angular/router';


@Injectable()
export class AuthGuard implements CanActivate {

    constructor(private authService: AuthService, private router: Router){ }

   canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {
        if(this.authService.isAuth()) {
            return true;
         } else {
            router.navigate("/");
            return false;
         }
}

}

אם המשתמש מזוהה באמצעות ה-AuthService הוא יוכל להיכנס לנתיב כי המתודה canActivate תחזיר true. ואם אינו מזוהה, הוא יופנה לדף הבית באמצעות router.navigate

 

צעד 6: נגדיר את הנתיבים שעליהם נשמור באמצעות canActivate

בקובץ ה-routing, נגדיר canActivate על הנתיבים שאנחנו מעוניינים להגן עליהם.

app-routing.module.ts
---------------------
import { AuthGuard } from './auth.guard';

const appRoutes: Routes = [
	{path: '', component: HomeComponent },
	{path: 'cars', component: CarsComponent, 
canActivate: [AuthGuard],
children:[
		{path: ':id', component: CarComponent },
		{path: ':id/edit', component: CarsEditComponent }
	]},
	{path: 'not-found', component: PageNotFoundComponent},
	{path: '**', redirectTo: '/not-found'}
];
  • canActivate בתוך הנתיב מקבל מערך של כל ה-guardים שבהם הוא צריך להשתמש.
  • הוא מונע גישה ממשתמשים שאינם מורשים גם לנתיב שעליו הוא יושב וגם לכל הנתיבים הילדים.

כתוצאה מהשימוש ב-guard canActivate משתמש שאינו מזוהה במערכת שינסה להיכנס לדף יופנה לדף הבית. רק אחרי שעשה לוגאין, הוא יוכל להיכנס לדף.

למדריכים נוספים בסדרת ה-Angular

 

אהבתם? לא אהבתם? דרגו!

0 הצבעות, ממוצע 0 מתוך 5 כוכבים

 

 

המדריכים באתר עוסקים בנושאי תכנות ופיתוח אישי. הקוד שמוצג משמש להדגמה ולצרכי לימוד. התוכן והקוד המוצגים באתר נבדקו בקפידה ונמצאו תקינים. אבל ייתכן ששימוש במערכות שונות, דוגמת דפדפן או מערכת הפעלה שונה ולאור השינויים הטכנולוגיים התכופים בעולם שבו אנו חיים יגרום לתוצאות שונות מהמצופה. בכל מקרה, אין בעל האתר נושא באחריות לכל שיבוש או שימוש לא אחראי בתכנים הלימודיים באתר.

למרות האמור לעיל, ומתוך רצון טוב, אם נתקלת בקשיים ביישום הקוד באתר מפאת מה שנראה לך כשגיאה או כחוסר עקביות נא להשאיר תגובה עם פירוט הבעיה באזור התגובות בתחתית המדריכים. זה יכול לעזור למשתמשים אחרים שנתקלו באותה בעיה ואם אני רואה שהבעיה עקרונית אני עשוי לערוך התאמה במדריך או להסיר אותו כדי להימנע מהטעיית הציבור.

שימו לב! הסקריפטים במדריכים מיועדים למטרות לימוד בלבד. כשאתם עובדים על הפרויקטים שלכם אתם צריכים להשתמש בספריות וסביבות פיתוח מוכחות, מהירות ובטוחות.

המשתמש באתר צריך להיות מודע לכך שאם וכאשר הוא מפתח קוד בשביל פרויקט הוא חייב לשים לב ולהשתמש בסביבת הפיתוח המתאימה ביותר, הבטוחה ביותר, היעילה ביותר וכמובן שהוא צריך לבדוק את הקוד בהיבטים של יעילות ואבטחה. מי אמר שלהיות מפתח זו עבודה קלה ?

השימוש שלך באתר מהווה ראייה להסכמתך עם הכללים והתקנות שנוסחו בהסכם תנאי השימוש.

הוסף תגובה חדשה

 

 

ענה על השאלה הפשוטה הבאה כתנאי להוספת תגובה:

דג למים הוא כמו ציפור ל...?

 

תמונת המגיב

יוסי בתאריך: 17.05.2018

good

תמונת המגיב

ריקי בתאריך: 15.08.2018

הסבר מצוין! עזר לי מאד1

תמונת המגיב

רייזי בתאריך: 09.10.2018

ממש ברור! יש טעות קטנה בתחילת צעד 1, כתוב,'/src/app/car.service.ts' במקום , 'src/app/auth.guard.ts'

תמונת המגיב

יוסי בן הרוש בתאריך: 09.10.2018

צודק. תודה רבה. תקנתי.

תמונת המגיב

נועה בתאריך: 25.11.2018

הסבר ממש מצוין וקל מאד ליישום תודה רבה!!! עזר לי מאד!!!!

תמונת המגיב

רחל בתאריך: 07.05.2019

מעולה!

תמונת המגיב

אביגיל בתאריך: 23.11.2019

תודה רבה!
עזרת לי מאד, כתוב בצורה ממש ברורה,
וטוב שזה בעברית... :)

תמונת המגיב

משה בתאריך: 17.12.2019

תודה על המאמר המצוין
כדאי לציין שיש אפשרות ליצור
guard עם Angular CLI
ng generate guard auth:
generate-guard

תמונת המגיב

מנור בתאריך: 21.02.2020

מדריך מצוין. תודה. הייתי שמח לקבל את החלק הHTML של הלוגין. שוב תודה.

תמונת המגיב

בנימין בתאריך: 24.01.2021

שאלה:
בעצם כל מה שהגרד עושה זה לתת "אישור כניסה" ע"פ ערך משתנה בוליאני שאני מביא לו?