Jaka jest różnica między canLoad
i 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;
}
Kiedy powinienem, który z nich?
canActivate
w powyższym scenariuszu, jaka będzie różnica?canActive
modułem zostanie załadowany (F12> Źródła - w chrome). Możesz tam zobaczyć pliki .js, zcanLoad
tymi modułami (pliki .js) nie zostaną załadowane :) Sprawdź moją odpowiedź powyżej, gdzie wyjaśniłem to lepiejcanLoad
zwraca true, a następnie wylogowuje się z aplikacji. Teraz użytkownik niebędący administratorem loguje się w tej samej przeglądarce, jak to działa? Czy załadowany moduł został eksmitowany lub usunięty z pamięci podręcznej?To jest test, który przeprowadziłem na obu strażnikach z modułem funkcji, który jest ładowany leniwie:
1. CanActivate Guard Test
zauważysz na dole strony Network, że wysłał 24 żądania o rozmiarze 9,5 MB, które zostały przesłane w 3,34 sekundy i w pełni załadowane w 3,47 sekundy.
1. Test CanLoad Guard
tutaj zobaczysz dużą różnicę, gdy użyliśmy CanLoad Guard, ponieważ przeglądarka przesłała tylko 18 żądań o rozmiarze 9,2 MB, które zostały przesłane, kończąc w 2,64 sekundy i w pełni ładując 2,59 sekundy.
CanLoad Guard nigdy nie ładuje danych modułu, jeśli użytkownik nie jest autoryzowany, co zapewnia większą wydajność, ponieważ czas ładowania zmniejszył się o prawie 1 sekundę, a to jest ogromny czas wczytywania stron internetowych, bez wątpienia zależy to od rozmiaru modułu.
źródło
canActivate
zwraca falseOdnośnie pytania z komentarzy w innym poście „Jeśli użyję canActivate w powyższym scenariuszu, jaka będzie różnica?”
Właściwie dla użytkownika nie będzie różnicy, nie uzyska on dostępu do strony w obu przypadkach. Chociaż jest jedna ukryta różnica . Jeśli naciśniesz F12 i przejdziesz do Źródła (w Chrome), gdzie są pobierane pliki. Następnie możesz zobaczyć, że w przypadku canActive został pobrany plik z kodem ( chunk.js ). Nawet jeśli nie masz dostępu do strony.
Ale w przypadku canLoad nie będzie pliku chunk.js z kodem źródłowym.
Jak więc widzisz, ma to naprawdę duży wpływ na bezpieczeństwo.
I oczywiście nie zapominaj, że canLoad może być używany tylko dla modułów LazyLoaded .
źródło
debugger;
instrukcję w konstruktorze dla jednego ze składników tego modułu. Możesz wtedy sprawdzić, czy został załadowany jako oddzielny fragment lub zawarty w module, takim jak main. Jeśli masz odwołania do komponentów w leniwym module, które nie są odizolowane od tego modułu, może on i tak zostać załadowany. Jeśli to widzisz, sugeruje to, że filtrujesz według czegoś innego niż pliki JS lub musisz podzielić swój leniwy moduł na zwykłe i „naprawdę leniwe” części.loadChildren
property jako części ścieżki do twojego leniwego modułu.CanLoad Straż uniemożliwia ładowanie Lazy Loaded Module. Zwykle używamy tego strażnika, gdy nie chcemy, aby nieautoryzowany użytkownik nawigował do żadnej z tras modułu, a także zatrzymał się, a nawet zobaczył kod źródłowy modułu.
Angular zapewnia canActivate Guard, który uniemożliwia nieautoryzowanemu dostęp do trasy. Nie przeszkadza to jednak w pobieraniu modułu. Użytkownik może użyć konsoli programisty chrome, aby zobaczyć kod źródłowy. CanLoad Guard zapobiega pobieraniu modułu.
W rzeczywistości CanLoad chroni moduł do załadowania, ale po załadowaniu modułu ochrona CanLoad nic nie zrobi. Załóżmy, że zabezpieczyliśmy ładowanie modułu za pomocą ochrony CanLoad dla nieuwierzytelnionego użytkownika. Gdy użytkownik jest zalogowany, moduł będzie można załadować i będziemy mogli nawigować po ścieżkach podrzędnych skonfigurowanych przez ten moduł. Ale gdy użytkownik jest wylogowany, nadal będzie mógł nawigować po ścieżkach podrzędnych, ponieważ moduł jest już załadowany. W takim przypadku, jeśli chcemy zabezpieczyć ścieżki podrzędne przed nieautoryzowanymi użytkownikami, musimy również użyć osłony CanActivate .
Użyj CanLoad przed załadowaniem modułu AdminModule:
Po załadowaniu AdminModule, w module AdminRouting możemy użyć CanActive do ochrony dzieci przed nieautoryzowanymi użytkownikami, jak poniżej:
źródło
canActivate służy do zapobiegania nieautoryzowanemu użytkownikowi
canLoad służy do zapobiegania całemu modułowi aplikacji
Przykład canActivate :
Przykład canLoad :
źródło
loadChildren
. Co więcej, najnowsza wersjaloadChildren: () => import('./user/user.module').then(m => m.UserModule)
canActivate, jeśli wejdzie nieautoryzowany użytkownik, nadal ładuje ten moduł. Potrzebujesz canLoad, aby ocenić, czy należy go załadować.
źródło
Warto zauważyć, że canLoad nie powstrzyma nikogo przed uzyskaniem Twojego kodu źródłowego. Plik .js nie zostanie pobrany przez przeglądarkę, chyba że użytkownik ma autoryzację, ale możesz wymusić ręczne pobranie, wykonując import („./ xxxxx.js”) w konsoli przeglądarki.
Nazwę modułu można łatwo znaleźć w pliku main.js w definicji tras.
źródło