Quelle est la différence entre canLoad
et canActivate
?
export interface Route {
path?: string;
pathMatch?: string;
matcher?: UrlMatcher;
component?: Type<any>;
redirectTo?: string;
outlet?: string;
canActivate?: any[];
canActivateChild?: any[];
canDeactivate?: any[];
canLoad?: any[];
data?: Data;
resolve?: ResolveData;
children?: Routes;
loadChildren?: LoadChildren;
}
Quand devrais-je lequel d'entre eux?
canActivate
dans le scénario ci-dessus, quelle sera la différence?canActive
module sera chargé (F12> Sources - dans chrome). Vous pouvez voir les fichiers .js ici. AveccanLoad
ces modules (fichiers .js) ne seront pas chargés :) Vérifiez ma réponse ci-dessus où je l'ai mieux expliquécanLoad
renvoie true, puis se déconnecte de l'application. Maintenant, un utilisateur non-administrateur se connecte dans le même navigateur, comment ça marche? Le module chargé a-t-il été expulsé ou supprimé du cache?Ceci est un test que j'ai fait sur les deux gardes avec un module de fonctionnalités qui est chargé paresseusement:
1. Test de protection CanActivate
vous remarquerez en bas de la page Réseau qu'il a effectué 24 requêtes d'une taille de 9,5 Mo transférées en 3,34 secondes et entièrement chargées en 3,47 secondes.
1. Test de CanLoad Guard
ici, vous verrez la grande différence lorsque nous avons utilisé CanLoad Guard car le navigateur n'a fait que 18 requêtes avec une taille de 9,2 Mo transférées, finissant en 2,64 secondes et 2,59 secondes à pleine charge.
CanLoad Guard ne charge jamais les données du module si l'utilisateur n'est pas autorisé et cela vous donne plus de performances car le temps de chargement a diminué de presque 1 seconde et c'est un temps énorme pour charger les pages Web, cela dépend sans aucun doute de la taille du module.
la source
En ce qui concerne la question des commentaires dans un autre message "Si j'utilise canActivate dans le scénario ci-dessus, quelle sera la différence?"
En fait, pour l'utilisateur, il n'y aura aucune différence, il n'aura aucun accès à la page dans les deux cas. Bien qu'il y ait une différence cachée . Si vous appuyez sur F12 et passez à Sources (dans Chrome) où se trouvent les fichiers téléchargés. Ensuite, vous pouvez voir que dans le cas où le fichier canActive avec le code a été téléchargé ( chunk.js ). Même si vous n'avez pas accès à la page.
Mais dans le cas de canLoad, il n'y aura pas de fichier chunk.js avec le code source.
Comme vous pouvez le voir, cela a un impact très important sur la sécurité.
Et bien sûr, n'oubliez pas que canLoad ne peut être utilisé que pour les modules LazyLoaded .
la source
debugger;
instruction dans le constructeur pour l'un des composants de ce module. Vous pouvez alors voir s'il a été chargé comme un morceau séparé ou inclus dans un module tel que main. Si vous avez des références à des composants dans un module différé qui ne sont pas isolés de ce module, il peut être chargé de toute façon. Si vous voyez cela, cela suggère soit que vous filtrez par autre chose que des fichiers JS, soit que vous devez séparer votre module paresseux en parties communes et «vraiment paresseuses».loadChildren
propriété dans le cadre du chemin d'accès à votre module différé.canActivate est utilisé pour empêcher un utilisateur non autorisé
canLoad est utilisé pour empêcher tout le module de l'application
Exemple de canActivate :
Exemple de canLoad :
la source
loadChildren
. De plus, une version récente de angular est ..loadChildren: () => import('./user/user.module').then(m => m.UserModule)
La canLoad Guard empêche le chargement du module Loaded Lazy. Nous utilisons généralement cette garde lorsque nous ne voulons pas à un utilisateur non autorisé de naviguer vers l'une des routes du module et également de s'arrêter puis même de voir le code source du module.
L'Angular fournit canActivate Guard, qui empêche les utilisateurs non autorisés d'accéder à l'itinéraire. Mais cela n'empêche pas le téléchargement du module. L'utilisateur peut utiliser la console de développement Chrome pour voir le code source. CanLoad Guard empêche le téléchargement du module.
En fait, CanLoad protège un module à charger, mais une fois le module chargé, CanLoad guard ne fera rien. Supposons que nous ayons protégé un chargement de module à l'aide de CanLoad guard pour un utilisateur non authentifié. Lorsque l'utilisateur est connecté, ce module sera applicable pour être chargé et nous pourrons naviguer dans les chemins enfants configurés par ce module. Mais lorsque l'utilisateur est déconnecté, l'utilisateur pourra toujours naviguer dans ces chemins enfants car le module est déjà chargé. Dans ce cas, si nous voulons protéger les chemins enfants des utilisateurs non autorisés, nous devons également utiliser la garde CanActivate .
Utilisez CanLoad avant de charger AdminModule:
Après avoir chargé AdminModule, dans le module AdminRouting, nous pouvons utiliser CanActive pour protéger les enfants contre les utilisateurs non autorisés comme ci-dessous:
la source
canActivate si un utilisateur non autorisé entre toujours charger ce module. vous avez besoin de canLoad pour déterminer s'il doit être chargé.
la source
Il est important de noter que canLoad n'empêchera personne d'obtenir votre code source. Le .js ne sera pas téléchargé par le navigateur à moins que l'utilisateur n'y soit autorisé, mais vous pouvez forcer un téléchargement manuel en exécutant une importation ('./ xxxxx.js') sur la console du navigateur.
Le nom du module peut être facilement trouvé sur votre main.js sur la définition de vos itinéraires.
la source