Sự khác biệt giữa canLoad và canActivate của Angular?


100

Sự khác biệt giữa canLoadvà là canActivategì?

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;
}

Khi nào tôi nên chọn một trong số họ?

Câu trả lời:


99

canActivate được sử dụng để ngăn người dùng trái phép truy cập các tuyến đường nhất định. Xem tài liệu để biết thêm thông tin.

canLoad được sử dụng để ngăn ứng dụng tải toàn bộ mô-đun một cách lười biếng nếu người dùng không được phép làm như vậy.

Xem tài liệu và ví dụ bên dưới để biết thêm thông tin.

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

Với mã này, mã cho AdminModule sẽ chỉ được tải vào ứng dụng nếu AuthGuard trả về true.

Nếu người dùng không được phép truy cập vào tuyến đường này và chúng tôi chỉ sử dụng một biện pháp canActivatebảo vệ, thì tuyến đường AdminModulesẽ được tải, mặc dù người dùng sẽ không thể truy cập tuyến đường đó.


6
Nếu tôi sử dụng canActivatetrong trường hợp trên, sự khác biệt sẽ là gì?
k11k2

3
@ k11k2 với canActivemô-đun sẽ được tải (F12> Nguồn - trong chrome). Bạn có thể thấy .js file there.With canLoadnhững module (file .js) sẽ không được nạp :) Kiểm tra câu trả lời của tôi ở trên, nơi tôi đã giải thích nó tốt hơn
DiPix

23
Còn về trường hợp Quản trị viên đã đăng nhập, vì vậy mô-đun quản trị được tải thông qua canLoadtrả về true và sau đó đăng xuất khỏi ứng dụng. Bây giờ, một người dùng không phải quản trị viên đăng nhập trên cùng một trình duyệt, nó hoạt động như thế nào? Mô-đun đã tải có bị loại bỏ hoặc bị xóa khỏi bộ nhớ cache không?
Keerthivasan

2
@Keerthivasan không có gì buộc phải xóa đoạn đã tải trước đó của AdminModule lười biếng khi người dùng đăng xuất và đăng nhập lại bằng một tài khoản khác không có đủ quyền để tải AdminModule. Tuy nhiên, bạn vẫn sẽ không có được quyền truy cập .. ngoại trừ việc có một mô-đun được lưu trong bộ nhớ cache đã tải. Tôi không nghĩ đó là một vấn đề bảo mật thực sự vì thường một thiết bị là một người dùng thực
hastrb

1
@ sgClaudia98 bạn có thể sử dụng cả hai, nhưng phải tuân theo lệnh nghiêm ngặt của lính canh. đây là lý do tại sao nó không có gì khác biệt trong trường hợp của bạn liên quan đến những gì tôi đã nêu một chút trước đây. Tôi nghĩ rằng tôi đã giải thích rất chi tiết trong nhận xét đầu tiên của tôi. Đó sẽ là trường hợp khá lạ nếu ngày nay có một thiết bị và admin / không phải admin đăng nhập lần lượt.
hastrb

36
  • CanActivate - Quyết định xem một tuyến đường có thể được kích hoạt hay không, trình bảo vệ này có thể không phải là cách tốt nhất cho các mô-đun tính năng được tải chậm, vì trình bảo vệ này sẽ luôn tải mô-đun trong bộ nhớ, ngay cả khi trình bảo vệ trả về false nghĩa là người dùng không được phép truy cập các tuyến đường.
  • CanLoad - Quyết định xem một mô-đun có thể được tải một cách lười biếng hay không, Kiểm soát nếu một tuyến đường thậm chí có thể được tải. Điều này trở nên hữu ích cho các mô-đun tính năng được tải chậm. Họ thậm chí sẽ không tải nếu bảo vệ trả về false.

Đây là bài kiểm tra tôi đã thực hiện trên cả hai bảo vệ với một mô-đun tính năng được tải chậm:

1. CanActivate Guard Test

bạn sẽ nhận thấy ở cuối trang Mạng rằng nó đã thực hiện 24 yêu cầu với kích thước 9,5 MB được chuyển hoàn tất trong 3,34 giây và tải đầy đủ trong 3,47 giây.

Có thể kích hoạt kiểm tra bảo vệ trên mô-đun tính năng tải lười biếng

1. Kiểm tra CanLoad Guard

ở đây bạn sẽ thấy sự khác biệt lớn khi chúng tôi sử dụng CanLoad Guard vì trình duyệt chỉ thực hiện 18 yêu cầu với kích thước 9,2 MB được chuyển hoàn tất trong 2,64 giây và tải đầy đủ 2,59 giây.

Kiểm tra CanLoad Guard trên mô-đun tính năng được tải Lazy

CanLoad Guard không bao giờ tải dữ liệu mô-đun nếu người dùng không được phép và điều đó mang lại cho bạn hiệu suất cao hơn vì thời gian tải giảm gần 1 giây và đó là thời gian rất lớn khi tải trang web, không nghi ngờ gì nữa, nó phụ thuộc vào kích thước mô-đun.

Mẹo: nếu bạn muốn thực hiện thử nghiệm trên dự án của mình, hãy đảm bảo rằng Disable Cachehộp kiểm trong tab mạng được chọn, hộp kiểm đó được đánh dấu trong hình ảnh đầu tiên


3
Chỉ để không gây nhầm lẫn cho ai đó .. 403 là Forbbiden, không phải Unauthorized mà là 401.
hastrb

20

Về câu hỏi từ các bình luận trong bài viết khác "Nếu tôi sử dụng canActivate trong trường hợp trên, sự khác biệt sẽ là gì?"

Trên thực tế, đối với người dùng sẽ không có sự khác biệt, anh ta sẽ không có quyền truy cập vào trang trong cả hai trường hợp. Mặc dù có một sự khác biệt tiềm ẩn . Nếu bạn nhấn F12 và di chuyển đến Nguồn (trong Chrome), nơi chứa tệp tải xuống. Sau đó, bạn có thể thấy rằng trong trường hợp tệp canActive có mã đã được tải xuống ( chunk.js ). Ngay cả khi bạn không có quyền truy cập vào trang. nhập mô tả hình ảnh ở đây

Nhưng trong trường hợp với canLoad sẽ không có tệp chunk.js với mã nguồn.

nhập mô tả hình ảnh ở đây

Vì vậy, như bạn có thể thấy điều này có tác động thực sự lớn đến bảo mật.

Và tất nhiên đừng quên rằng canLoad chỉ có thể được sử dụng cho các Mô-đun LazyLoaded .


3
Không thể thấy bất kỳ đoạn nào dành cho mô-đun tải lười biếng trong tab mạng của tôi nhưng các tuyến đường hoạt động như mong đợi, làm thế nào tôi có thể xác nhận mô-đun của mình đang tải theo yêu cầu hay không?
k11k2 14/03/18

@ k11k2 nếu bạn muốn xem tệp nào mà một mô-đun là một phần, chỉ cần thêm một debugger;câu lệnh trong hàm tạo cho một trong các thành phần trong mô-đun đó. Sau đó, bạn có thể xem liệu nó đã được tải dưới dạng một đoạn riêng biệt hay được bao gồm trong một mô-đun chẳng hạn như chính. Nếu bạn có tham chiếu đến các thành phần trong một mô-đun lười biếng không được cách ly với mô-đun đó, nó vẫn có thể được tải. Nếu bạn thấy điều này, nó cho thấy bạn đang lọc theo thứ gì đó khác ngoài tệp JS hoặc bạn cần phải chia mô-đun lười biếng của mình thành các phần chung và 'thực sự lười biếng'.
Simon_Weaver

@ k11k2 Tôi nghĩ rằng "mô-đun tải lười biếng" của bạn không được tải một cách lười biếng. Đảm bảo rằng bạn đã sử dụng thuộc loadChildrentính như một phần của đường dẫn đến mô-đun lười biếng của mình.
hastrb

16

canActivate được sử dụng để ngăn chặn người dùng trái phép

canLoad được sử dụng để ngăn toàn bộ mô-đun của ứng dụng

Ví dụ về canActivate :

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

Ví dụ về canLoad :

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

Đối với các độc giả tương lai, ví dụ canActive không phải là lười biếng, nhưng canLoad là .. do có loadChildren. Hơn nữa, một phiên bản gần đây của loadChildren: () => import('./user/user.module').then(m => m.UserModule)
angle

Giải thích rất đơn giản, thích nó :)
KTM

16

Các CanLoad Guard ngăn chặn việc tải của Module Loaded Lazy. Chúng tôi thường sử dụng biện pháp bảo vệ này khi chúng tôi không muốn người dùng trái phép điều hướng đến bất kỳ tuyến nào của mô-đun và cũng dừng lại sau đó thậm chí xem mã nguồn của mô-đun.

Angular cung cấp canActivate Guard, ngăn người dùng trái phép truy cập vào tuyến đường. Nhưng nó không ngăn mô-đun được tải xuống. Người dùng có thể sử dụng bảng điều khiển dành cho nhà phát triển chrome để xem mã nguồn. CanLoad Guard ngăn không cho tải xuống mô-đun.

Trên thực tế, CanLoad bảo vệ một mô-đun được tải nhưng một khi mô-đun được tải thì chức năng bảo vệ CanLoad sẽ không làm gì cả. Giả sử chúng ta đã bảo vệ việc tải mô-đun bằng cách sử dụng bảo vệ CanLoad cho người dùng chưa được xác thực. Khi người dùng đăng nhập thì mô-đun đó sẽ được áp dụng để tải và chúng tôi sẽ có thể điều hướng các đường dẫn con được cấu hình bởi mô-đun đó. Nhưng khi người dùng đăng xuất, người dùng vẫn có thể điều hướng các đường dẫn con đó vì mô-đun đã được tải. Trong trường hợp này, nếu chúng tôi muốn bảo vệ đường dẫn trẻ em khỏi những người dùng trái phép, chúng tôi cũng cần sử dụng tính năng bảo vệ CanActivate .

Sử dụng CanLoad trước khi tải AdminModule:

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

Sau khi tải AdminModule, trong mô-đun AdminRouting, chúng ta có thể sử dụng CanActive để bảo vệ trẻ em khỏi những người dùng trái phép như dưới đây:

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

Vì vậy, người ta nên sử dụng cả canLoad và canActivate?
Tarida George

0

canActivate nếu người dùng nhập trái phép vẫn tải mô-đun đó. bạn cần canLoad để đánh giá xem nó có cần được tải hay không.


0

Điều quan trọng cần lưu ý là canLoad sẽ không ngăn ai đó lấy mã nguồn của bạn. .Js sẽ không được tải xuống bằng trình duyệt trừ khi người dùng được phép, nhưng bạn có thể buộc tải xuống thủ công bằng cách nhập ('./ xxxxx.js') trên bảng điều khiển của trình duyệt.

Bạn có thể dễ dàng tìm thấy tên mô-đun trên main.js về định nghĩa các tuyến đường của bạn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.