Запустите службу до загрузки приложения или компонентов Angular 7 - PullRequest
2 голосов
/ 21 января 2020

Я создаю приложение, используя Angular 7, я обработал вызовы API, систему аутентификации JWT Token, используя C#, а также обновляю LocalStorage () при необходимости, когда пользователь входит в систему и выходит из нее, и все это работает отлично.

Моя проблема в том, что я хочу, чтобы он выполнял проверку входа в систему как промежуточное ПО в приложении, а не в методе жизненного цикла - ng.onInit(). Как мне go узнать об этом?

Есть ли способ выполнить события жизненного цикла в качестве компонента входа или службы. То есть перед загрузкой любого компонента он может проверить, вошел ли пользователь в систему или нет, и перенаправить через маршрутизатор на нужную страницу.

Ответы [ 4 ]

1 голос
/ 01 февраля 2020

Решения о маршрутизации на основе истечения срока действия токена

Если вы используете JSON веб-токены (JWT) для защиты своего приложения Angular (и я рекомендую это сделать), Один из способов принять решение о том, следует ли обращаться к маршруту, - проверить время истечения токена. Вероятно, вы используете JWT, чтобы позволить вашим пользователям получать доступ к защищенным ресурсам на вашем бэкэнде. В этом случае токен не будет полезен, если срок его действия истек, поэтому это хороший признак того, что пользователя следует считать «не прошедшим проверку подлинности».

Создайте метод в службе проверки подлинности, который проверяет действительно ли пользователь аутентифицирован. Опять же, для целей аутентификации без сохранения состояния с помощью JWT это просто вопрос истечения срока действия токена. Для этого можно использовать класс JwtHelperService из angular2-jwt .

// src/app/auth/auth.service.ts
import { Injectable } from '@angular/core';
import { JwtHelperService } from '@auth0/angular-jwt';
@Injectable()
export class AuthService {
  constructor(public jwtHelper: JwtHelperService) {}
  // ...
  public isAuthenticated(): boolean {
    const token = localStorage.getItem('token');
    // Check whether the token is expired and return
    // true or false
    return !this.jwtHelper.isTokenExpired(token);
  }
}

Примечание. В этом примере предполагается, что вы хранение JWT пользователя в локальном хранилище.

Создайте новый сервис, который реализует защиту маршрута. Вы можете называть его как угодно, но обычно достаточно что-то вроде auth-guard.service.

// src/app/auth/auth-guard.service.ts
import { Injectable } from '@angular/core';
import { Router, CanActivate } from '@angular/router';
import { AuthService } from './auth.service';
@Injectable()
export class AuthGuardService implements CanActivate {
  constructor(public auth: AuthService, public router: Router) {}
  canActivate(): boolean {
    if (!this.auth.isAuthenticated()) {
      this.router.navigate(['login']);
      return false;
    }
    return true;
  }
}

Служба внедряет AuthService и Router и имеет один метод с именем canActivate . Этот метод необходим для правильной реализации интерфейса CanActivate .

Метод canActivate возвращает логическое значение, указывающее, следует ли разрешить навигацию по маршруту. Если пользователь не аутентифицирован, он перенаправляется в другое место, в этом случае маршрут называется / login. Теперь защита может быть применена к любым маршрутам, которые вы хотите защитить.

// src/app/app.routes.ts
import { Routes, CanActivate } from '@angular/router';
import { ProfileComponent } from './profile/profile.component';
import { 
  AuthGuardService as AuthGuard 
} from './auth/auth-guard.service';
export const ROUTES: Routes = [
  { path: '', component: HomeComponent },
  { 
    path: 'profile',
    component: ProfileComponent,
    canActivate: [AuthGuard] 
  },
  { path: '**', redirectTo: '' }
];

У маршрута / profile теперь есть дополнительное значение конфигурации: canActivate. AuthGuard, созданный выше, передается в массив для canActivate, что означает, что он будет запускаться каждый раз, когда кто-то пытается получить доступ к маршруту / profile. Если пользователь аутентифицирован, он попадает в маршрут. Если нет, они перенаправляются на маршрут / login.

Примечание: canActivate guard все еще позволяет компоненту для данного маршрута быть активированным (но не перемещенным к нему). Если бы мы вообще хотели предотвратить активацию, мы могли бы использовать защиту canLoad.

больше информации здесь

1 голос
/ 21 января 2020

Вы должны проверить охрану в angular, особенно canActivate Guard: https://angular.io/guide/router

Страж создается следующим образом:

@Injectable({
  providedIn: 'root'
})
export class MyGuard implements CanLoad {
 constructor() {}

 canLoad(route: Route, segments: UrlSegment[]): Observable<boolean> | 
 Promise<boolean> | boolean {
   const x = true;
   if (x) {
     return true; // It allows access to the route;
   } else {
      // redirect where you want;
     return false; // it doesnt allow to access to the route
  }
 }
}

Затем в Ваш модуль маршрутизации:

{
path: "yourRoute",
canActivate: [MyGuard],
component: YourComponent
}

Для аутентификации у вас есть хорошая библиотека, которая использует охрану здесь: https://www.npmjs.com/package/ngx-auth

1 голос
/ 21 января 2020

Защита основана на маршрутах ... поэтому я думаю, что вы должны предпочесть решение для модуля / сервиса.

import { APP_INITIALIZER } from '@angular/core';

, а затем добавить его в качестве провайдера следующим образом:

 export function initApp(initService: YourInitService) {
  return () => { 
    initService.Init();
  }
}
    { provide: APP_INITIALIZER,useFactory: initApp, deps: [YourInitService], multi: true } 
0 голосов
/ 21 января 2020

Вы должны реализовать authGuardService или что-то подобное, чтобы использовать его в качестве промежуточного программного обеспечения для маршрутизации (используя раздел canActivate)

См .: https://angular.io/api/router/CanActivate

Это предотвращает загрузку маршрутов, если canActivate не выполняет условие (что предпочтительно при использовании системы входа в систему и т. Д. c вместо проверки в ловушках жизненного цикла).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...