Apa perbedaan antara canLoad
dan 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;
}
Kapan saya harus yang mana dari mereka?
canActivate
skenario di atas, apa bedanya?canActive
modul akan dimuat (F12> Sumber - di chrome). Anda dapat melihat file .js di sana. DengancanLoad
modul ini (file .js) tidak akan dimuat :) Periksa jawaban saya di atas di mana saya menjelaskannya dengan lebih baikcanLoad
return true dan kemudian logout dari aplikasi. Sekarang, pengguna non-admin login di browser yang sama, bagaimana cara kerjanya? Apakah modul yang dimuat diusir atau dihapus dari cache?Ini adalah tes yang saya lakukan pada kedua penjaga dengan modul fitur yang dimuat lambat:
1. CanActivate Guard Test
Anda akan melihat di bagian bawah halaman Jaringan bahwa itu membuat 24 permintaan dengan ukuran 9,5 MB ditransfer selesai dalam 3,34 detik dan dimuat penuh dalam 3,47 detik.
1. Tes CanLoad Guard
di sini Anda akan melihat perbedaan besar ketika kami menggunakan CanLoad Guard karena browser hanya membuat 18 permintaan dengan ukuran 9,2 MB yang ditransfer selesai dalam 2,64 detik dan dimuat penuh 2,59 detik.
CanLoad Guard tidak pernah memuat data modul jika pengguna tidak berwenang dan itu memberi Anda kinerja lebih karena waktu muat berkurang hampir 1 detik dan itu merupakan waktu yang sangat lama dalam memuat halaman web, tidak diragukan lagi itu tergantung pada ukuran modul.
sumber
canActivate
mengembalikan falseMengenai pertanyaan dari komentar di posting lain "Jika saya menggunakan canActivate dalam skenario di atas, apa bedanya?"
Sebenarnya bagi pengguna tidak akan ada perbedaan, dia tidak akan mendapatkan akses ke halaman dalam kedua kasus tersebut. Meski ada satu perbedaan tersembunyi . Jika Anda menekan F12 dan pindah ke Sumber (di Chrome) tempat mengunduh file. Kemudian Anda dapat melihat bahwa dalam kasus dengan file canActive dengan kode telah diunduh ( chunk.js ). Meskipun Anda tidak memiliki akses ke halaman tersebut.
Tetapi dalam kasus canLoad tidak akan ada file chunk.js dengan kode sumber.
Jadi seperti yang Anda lihat, ini berdampak sangat besar bagi keamanan.
Dan tentunya jangan lupa bahwa canLoad hanya bisa digunakan untuk LazyLoaded Modules .
sumber
debugger;
pernyataan di konstruktor untuk salah satu komponen dalam modul itu. Anda kemudian dapat melihat apakah itu dimuat sebagai potongan terpisah atau termasuk dalam modul seperti main. Jika Anda memiliki referensi ke komponen dalam modul malas yang tidak diisolasi ke modul itu, ia mungkin tetap dimuat. Jika Anda melihat ini, ini menunjukkan bahwa Anda memfilter berdasarkan sesuatu selain file JS, atau Anda perlu memecah modul lazy Anda menjadi bagian-bagian umum dan 'benar-benar malas'.loadChildren
properti sebagai bagian dari jalur ke modul malas Anda.The CanLoad Penjaga mencegah pemuatan malas Modul Loaded. Kami biasanya menggunakan pelindung ini ketika kami tidak ingin pengguna yang tidak sah untuk menavigasi ke salah satu rute modul dan juga berhenti bahkan melihat kode sumber dari modul.
Angular menyediakan penjaga canActivate , yang mencegah pengguna yang tidak sah mengakses rute. Tetapi itu tidak menghentikan modul untuk diunduh. Pengguna dapat menggunakan konsol pengembang chrome untuk melihat kode sumber. CanLoad Guard mencegah modul agar tidak diunduh.
Sebenarnya, CanLoad melindungi modul yang akan dimuat tetapi setelah modul dimuat, penjaga CanLoad tidak akan melakukan apa-apa. Misalkan kita telah melindungi pemuatan modul menggunakan CanLoad guard untuk pengguna yang tidak berkepentingan. Saat pengguna masuk, modul itu akan berlaku untuk dimuat dan kita akan dapat menavigasi jalur turunan yang dikonfigurasi oleh modul itu. Namun saat pengguna keluar, pengguna tetap dapat menavigasi jalur turunan tersebut karena modul sudah dimuat. Dalam kasus ini jika kita ingin melindungi jalur anak dari pengguna yang tidak sah, kita juga perlu menggunakan penjaga CanActivate .
Gunakan CanLoad sebelum memuat AdminModule:
Setelah memuat AdminModule, di modul AdminRouting kita dapat menggunakan CanActive untuk melindungi anak dari pengguna yang tidak sah seperti di bawah ini:
sumber
canActivate digunakan untuk mencegah pengguna yang tidak sah
canLoad digunakan untuk mencegah seluruh modul aplikasi
Contoh canActivate :
Contoh canLoad :
sumber
loadChildren
. Selain itu, versi terbaru dari sudut adalah ..loadChildren: () => import('./user/user.module').then(m => m.UserModule)
canActivate jika pengguna yang tidak sah masih memasukkan modul itu. Anda perlu canLoad untuk membuat penilaian apakah perlu dimuat.
sumber
Penting untuk diperhatikan bahwa canLoad tidak akan menghentikan seseorang untuk mendapatkan kode sumber Anda. .Js tidak akan diunduh oleh browser kecuali pengguna diizinkan, tetapi Anda dapat memaksa unduhan manual dengan mengeluarkan impor ('./ xxxxx.js') pada konsol browser.
Nama modul dapat dengan mudah ditemukan di main.js pada definisi rute Anda.
sumber