Ionic/Angular 16和Auth Guard(应用CanActivateFn)

我最近验证了使用Angular来控制认证相关界面的功能。以前我使用@angular/router模块的CanActivate来进行控制,但最新版本的Angular中已不推荐使用,而是推荐使用CanActivateFn。

已经实施

    • @angular/routerのCanActivateからCanActivateFnへのポーティング

 

    • エンドポイントAPIとの通信

 

    Webストレージに情報を格納/消去

源代码

我們把本次動作驗證所使用的源代碼公開在這裡,希望能對您提供一些參考。

 

主要模块 (zhǔ mó

    • Angular ver16

 

    • Ionic/Angular Ver7

 

    • rxjs Ver7

 

    その他エンドポイントexpress.jsなど

Auth Guard 和 CanActivateFn

由于许多前辈已在其他页面中介绍了Auth Guard的概念,因此在此帖子中我们将省略这部分内容。
在实现auth guard时,我们希望将重点放在从CanActivate(Ver15)变更为CanActivateFn(Ver16)的变化上。

在之前的版本中

在之前的Ionic/Angular版本中,添加页面时有一个选项叫做guards,它可以方便地自动生成代码。自动生成的代码会应用CanActivate并展开基本的代码结构。

使用ionic generate添加的示例:

$ ionic g
? What would you like to generate?       
  module
  class
  directive
> guard
  pipe
  interface
  enum
(Move up and down to reveal more choices
? Name/path of guard: protected
> ng.cmd generate guard auth --project=app
? Which type of guard would you like to create? (Press <space> to select, <a> to toggle all, <i> to invert selection, and <enter> to proceed)
>(*) CanActivate
 ( ) CanActivateChild
 ( ) CanDeactivate
 ( ) CanLoad
 ( ) CanMatch
CREATE src/app/protected.guard.spec.ts (331 bytes)
CREATE src/app/protected.guard.ts (457 bytes)     
[OK] Generated guard!

在指定的路径下生成了”protected.guard.ts”。
自动生成的示例:

import { Injectable } from '@angular/core';
import { ActivatedRouteSnapshot, CanActivate, RouterStateSnapshot, UrlTree } from '@angular/router';
import { Observable } from 'rxjs';

@Injectable({
  providedIn: 'root'
})
export class ProtectedGuard implements CanActivate {
  canActivate(
    route: ActivatedRouteSnapshot,
    state: RouterStateSnapshot): Observable<boolean | UrlTree> | Promise<boolean | UrlTree> | boolean | UrlTree {

    // ここで判定結果を返却する実装が一般的です。
    // 外部サービス呼び出しや内部のチェックロジックを実装するなど。
    return true;
  }
}

这次的

如前所述,如果要使用最新版本的Angular 16,請更改使用CanActivateFn而不是CanActivate。

受保护的.guard.ts

我們將根據以上指示進行實施更改,新加入一個名為protectedGuard的CanActivateFn。

export const protectedGuard: CanActivateFn = (_route: ActivatedRouteSnapshot, state: RouterStateSnapshot) => {
  const guard = inject(ProtectedGuard);
  return guard.canActivate(state);
};

export class ProtectedGuard {
  canActivate(state: RouterStateSnapshot): Observable<boolean> {
    // 認証状態を判定するロジックを入れる
    return true;
  }
}

app-routing.module.ts 路由模块

此外,您可以使用与旧版本相同的实现方式来配置路由器。带有 canActivate: [ProtectedGuard] 的部分与之前版本的描述相同。

path: 'dashboard',
loadChildren: () => import('./pages/dashboard/dashboard.module').then( m => m.DashboardPageModule),
canActivate: [ProtectedGuard]

下次是

在推进FireFly验证的过程中,我们将来可能需要前端认证相关的应用程序,因此尝试在认证部分的机制中进行实施。
下次,我希望能够推进有关使用FireFly为基础制造应用程序所需的技术要素的验证。

广告
将在 10 秒后关闭
bannerAds