Angular'ın canLoad ve canActivate arasındaki fark nedir?


101

Arasındaki fark nedir canLoadve 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;
}

Hangisini ne zaman yapmalıyım?

Yanıtlar:


100

canActivate , yetkisiz kullanıcıların belirli rotalara erişmesini önlemek için kullanılır. Daha fazla bilgi için belgelere bakın .

canLoad , kullanıcının yetkisi yoksa uygulamanın tüm modülleri tembel olarak yüklemesini önlemek için kullanılır.

Daha fazla bilgi için aşağıdaki belgelere ve örneğe bakın.

{
    path: 'admin',
    loadChildren: 'app/admin/admin.module#AdminModule',
    canLoad: [AuthGuard]
},

Bu kodla, AdminModule için kod yalnızca AuthGuard geri dönerse uygulamaya yüklenecektir true.

Kullanıcının bu rotaya erişme yetkisi yoksa ve biz sadece bir canActivatekoruma kullanmış olsaydık, kullanıcı bu rotaya erişemese AdminModulebile yüklenirdi.


6
canActivateYukarıdaki senaryoda kullanırsam fark ne olur?
k11k2

3
@ k11k2 canActivemodülü ile yüklenecek (F12> Kaynaklar - kromda ). Burada .js dosyalarını görebilirsiniz. canLoadBu modüllerle (.js dosyaları) yüklenmeyecek :) Cevabımı daha iyi açıkladığım yukarıda kontrol edin
DiPix

23
Yöneticinin oturum açtığı, bu nedenle yönetici modülünün yüklendiği senaryo canLoadtrue döndürür ve ardından uygulamadan çıkış yapar. Şimdi, yönetici olmayan bir kullanıcı aynı tarayıcıda oturum açar, nasıl çalışır? Yüklenen modül tahliye edildi mi veya önbellekten kaldırıldı mı?
Keerthivasan

2
@Keerthivasan hiçbir şey, bir kullanıcı oturumu kapattığında ve AdminModule'ün yüklenmesi için yeterli izne sahip olmayan farklı bir hesapla tekrar oturum açtığında tembel AdminModule'ün önceden yüklenmiş yığınını kaldırmaya zorlamaz. Ancak, yüklü bir önbelleğe alınmış modül dışında .. erişim elde edemezsiniz. Genellikle tek bir cihaz gerçek bir kullanıcı olduğu için bunun gerçek bir güvenlik sorunu olduğunu sanmıyorum
hastrb

1
@ sgClaudia98 her ikisini de kullanabilirsiniz, ancak korumaların sıkı bir şekilde yürütülmesi emri vardır. bu yüzden biraz daha önce söylediklerimle ilgili olarak sizin durumunuzda hiçbir fark yok. Sanırım ilk yorumuma çok detaylı bir açıklama koydum. Bugünlerde tek bir cihaz ve yönetici / yönetici olmayan oturum açma tek tek varsa bu oldukça garip bir durum olurdu.
hastrb

36
  • CanActivate - Bir rotanın etkinleştirilip etkinleştirilemeyeceğine karar verir, bu koruma, gecikmeli olarak yüklenen özellik modülleri için en iyi yol olmayabilir, çünkü koruma yanlış dönse bile, bu koruma modülü her zaman belleğe yükleyecektir, bu da kullanıcının erişim yetkisinin olmadığı anlamına gelir rota.
  • CanLoad - Bir modülün tembel olarak yüklenip yüklenemeyeceğine karar verir, Bir rotanın yüklenip yüklenemeyeceğini kontrol eder. Bu, geç yüklenen özellik modülleri için kullanışlı hale gelir. Koruma yanlış dönerse bile yüklenmezler.

Bu, tembel yüklü bir özellik modülüyle her iki koruma üzerinde yaptığım bir test:

1. Koruma Testini Etkinleştirebilir

Ağ sayfasının alt kısmında 9.5 MB büyüklüğünde 24 istek yaptığını ve 3.34 saniyede tamamlandığını ve 3.47 saniyede tam yüklendiğini fark edeceksiniz.

Tembel Yüklü Özellik Modülünde Koruma Testini Etkinleştirebilir

1. CanLoad Guard Testi

Burada CanLoad Guard'ı kullandığımızda büyük farkı göreceksiniz, çünkü tarayıcı 2,64 saniyede ve tam yüklü 2,59 saniyede 9,2 MB büyüklüğünde yalnızca 18 istek yaptı.

Tembel Yüklü Özellik Modülünde CanLoad Koruma Testi

CanLoad Guard, kullanıcı yetkilendirilmemişse modül verilerini asla yüklemez ve bu size daha fazla performans sağlar çünkü yükleme süresi neredeyse 1 saniye azalır ve bu, web sayfalarını yüklemede çok büyük bir süredir, şüphesiz modül boyutuna bağlıdır.

İpucu: Projenizde testi yapmak istiyorsanız Disable Cache, ağ sekmesindeki onay kutusunun işaretli olduğundan emin olun, ilk görüntüde işaretlendi


3
Sadece birinin kafasını karıştırmamak için .. 403 Forbiden, Yetkisiz değil ki 401.
hastrb

20

Diğer gönderideki yorumlardan gelen soruya gelince, "Yukarıdaki senaryoda canActivate kullanırsam fark ne olur?"

Aslında kullanıcı için bir fark olmayacak, her iki durumda da sayfaya erişim sağlayamayacak. Gizli bir fark olmasına rağmen . F12'ye basar ve Dosyaların indirildiği Kaynaklar'a (Chrome'da) geçerseniz. Daha sonra, kodlu canActive dosyasının indirilmesi durumunda bunu görebilirsiniz ( chunk.js ). Sayfaya erişiminiz olmasa bile. görüntü açıklamasını buraya girin

Ancak canLoad durumunda , kaynak kodlu chunk.js dosyası olmayacaktır .

görüntü açıklamasını buraya girin

Gördüğünüz gibi bunun güvenlik için gerçekten büyük bir etkisi var.

Ve elbette canLoad'un sadece LazyLoaded Modüller için kullanılabileceğini unutmayın .


3
ağ sekmemde tembel yükleme modülü için herhangi bir parça göremiyorum, ancak beklendiği gibi çalışan yollar modüllerimin istek üzerine yüklendiğini veya yüklenmediğini nasıl onaylayabilirim?
k11k2

@ k11k2 Bir modülün hangi dosyanın parçası olduğunu görmek istiyorsanız, yapıcıya debugger;o modüldeki bileşenlerden biri için bir ifade ekleyin . Daha sonra ayrı bir yığın olarak mı yüklendiğini yoksa main gibi bir modüle mi dahil edildiğini görebilirsiniz. Geç bir modüldeki bileşenlere, o modüle izole edilmemiş olan referanslarınız varsa, yine de yüklenebilir. Bunu görürseniz, ya JS dosyalarından başka bir şeye göre filtre uyguladığınızı ya da tembel modülünüzü ortak ve 'gerçekten tembel' parçalara ayırmanız gerektiğini gösterir.
Simon_Weaver

@ k11k2 Bence "tembel yükleme modülünüz" tembel yüklenmiyor. loadChildrenÖzelliği, tembel modülünüze giden yolun bir parçası olarak kullandığınızdan emin olun .
hastrb

16

canActivate , yetkisiz bir kullanıcıyı önlemek için kullanılır

canLoad , uygulamanın tüm modülünü önlemek için kullanılır

Örnek canActivate :

{ path: 'product',canActivate:[RouteGaurd], component : ProductComponent }

Örnek canLoad :

{ path: 'user' , canLoad: [AuthenticGuard], loadChildren : './user/user.module#UserModule' }

Gelecekteki okuyucular için canActive örneği tembel değil, ancak canLoad .. sahip olmaktan kaynaklanıyor loadChildren. Dahası, loadChildren: () => import('./user/user.module').then(m => m.UserModule)
angular'ın

Çok basit bir açıklama, beğendim :)
KTM

16

CanLoad Görevlisi Lazy yüklenmiş bir modül yükleme önler. Bu korumayı genellikle yetkisiz bir kullanıcının modülün herhangi bir rotasına gitmesini istemediğimizde ve hatta modülün kaynak kodunu görüp durduktan sonra bile kullanırız.

Angular, yetkisiz kullanıcıların rotaya erişmesini önleyen canActivate Guard özelliğini sağlar . Ancak modülün indirilmesini durdurmaz. Kullanıcı, kaynak kodunu görmek için chrome geliştirici konsolunu kullanabilir. CanLoad Guard, modülün indirilmesini engeller.

Aslında, CanLoad bir modülü yüklenmek üzere korur , ancak modül yüklendikten sonra CanLoad koruması hiçbir şey yapmaz. Kimliği doğrulanmamış kullanıcı için CanLoad koruması kullanarak bir modül yüklemesini koruduğumuzu varsayalım . Kullanıcı oturum açtığında, bu modül yüklenmeye uygun olacak ve bu modül tarafından yapılandırılan çocuk yollarda gezinebileceğiz. Ancak kullanıcı oturumu kapattığında, modül zaten yüklü olduğu için yine de kullanıcı bu alt yollarda gezinebilecektir. Bu durumda, çocuk yollarını yetkisiz kullanıcılardan korumak istiyorsak, CanActivate korumasını da kullanmamız gerekir .

AdminModule'u yüklemeden önce CanLoad'u kullanın :

  {
        path: 'admin',
        loadChildren: 'app/admin/admin.module#AdminModule',
        canLoad: [ AuthGuardService ]
      },

AdminModule'u yükledikten sonra, AdminRouting modülünde CanActive'i aşağıdaki gibi yetkisiz kullanıcılardan korumak için kullanabiliriz :

{ 
      path: '',
      component: AdminComponent,
      children: [ 
        {
          path: 'person-list',
          component: PersonListComponent,
          canActivate: [ AuthGuardService ]
        }
      ]
    }  

Yani hem canLoad hem de canActivate kullanılmalı mı?
Tarida George

0

Yetkisiz kullanıcı girerse etkinleştirin o modülü yükler. İhtiyacınız canLoad o yüklenecek ihtiyacı olmadığını yargı elde etmek.


0

CanLoad'un birisinin kaynak kodunuzu almasını engellemeyeceğini fark etmek önemlidir . .Js, kullanıcı yetkilendirilmedikçe tarayıcı tarafından indirilmez, ancak tarayıcı konsolunda bir içe aktarma ('./ xxxxx.js') yayınlayarak manuel indirmeyi zorlayabilirsiniz.

Modül adı, rotalar tanımlamanızdaki main.js'de kolayca bulunabilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.