В чем разница между canLoad
и 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;
}
Когда мне следует какой из них?
canActivate
описанным выше сценарием, какая будет разница?canActive
Будет загружен @ k11k2 с модулем (F12> Источники - в хроме). Там вы можете увидеть файлы .js. СcanLoad
этими модулями (файлы .js) не загружаются :) Посмотрите мой ответ выше, где я объяснил это лучшеcanLoad
возвращает true, а затем выходит из приложения. Теперь, когда пользователь без прав администратора входит в систему в том же браузере, как это работает? Был ли удален загруженный модуль из кеша?Это тест, который я провел на обоих охранниках с ленивым загруженным функциональным модулем:
1. Тест CanActivate Guard
Внизу страницы «Сеть» вы заметите, что он сделал 24 запроса размером 9,5 МБ, завершил передачу за 3,34 секунды и полную загрузку за 3,47 секунды.
1. Тест CanLoad Guard
здесь вы увидите большую разницу, когда мы использовали CanLoad Guard, поскольку браузер сделал всего 18 запросов размером 9,2 МБ, передал завершение за 2,64 секунды и полную загрузку за 2,59 секунды.
CanLoad Guard никогда не загружает данные модуля, если пользователь не авторизован, и это дает вам больше производительности, поскольку время загрузки уменьшилось почти на 1 секунду, а это огромное время для загрузки веб-страниц, без сомнения, это зависит от размера модуля.
источник
Что касается вопроса из комментариев в другом сообщении «Если я использую canActivate в приведенном выше сценарии, какая будет разница?»
Собственно для пользователя разницы не будет, он не получит доступа к странице в обоих случаях. Хотя есть одно скрытое отличие . Если вы нажмете F12 и перейдете в Источники (в Chrome), где находятся файлы для загрузки. Тогда вы увидите, что в случае с canActive был загружен файл с кодом ( chunk.js ). Даже если у вас нет доступа к странице.
Но в случае с canLoad там не будет chunk.js файл с исходным кодом.
Как видите, это действительно сильно влияет на безопасность.
И, конечно же, не забывайте, что canLoad можно использовать только для модулей LazyLoaded .
источник
debugger;
оператор в конструктор для одного из компонентов этого модуля. Затем вы можете увидеть, был ли он загружен как отдельный блок или включен в такой модуль, как main. Если у вас есть ссылки на компоненты в ленивом модуле, которые не изолированы от этого модуля, он все равно может быть загружен. Если вы видите это, это говорит о том, что вы фильтруете что-то другое, кроме файлов JS, или вам нужно разбить свой ленивый модуль на общие и «действительно ленивые» части.loadChildren
свойство как часть пути к вашему ленивому модулю.canActivate используется для предотвращения несанкционированного доступа
canLoad используется для предотвращения всего модуля приложения
Пример canActivate :
Пример canLoad :
источник
loadChildren
. Более того, последняя версия angular - это ..loadChildren: () => import('./user/user.module').then(m => m.UserModule)
CanLoad Guard предотвращает загрузку загруженного модуля ленивых. Обычно мы используем эту защиту, когда мы не хотим, чтобы неавторизованный пользователь переходил к любому из маршрутов модуля, а также останавливался, а затем даже видел исходный код модуля.
Angular предоставляет canActivate Guard, который предотвращает несанкционированный доступ к маршруту. Но это не мешает загрузке модуля. Пользователь может использовать консоль разработчика Chrome для просмотра исходного кода. CanLoad Guard предотвращает загрузку модуля.
Фактически, CanLoad защищает загружаемый модуль, но после загрузки модуля CanLoad guard ничего не сделает. Предположим, мы защитили загрузку модуля с помощью CanLoad guard для неаутентифицированного пользователя. Когда пользователь вошел в систему, этот модуль можно будет загрузить, и мы сможем перемещаться по дочерним путям, настроенным этим модулем. Но когда пользователь выйдет из системы, он по-прежнему сможет перемещаться по этим дочерним путям, потому что модуль уже загружен. В этом случае, если мы хотим защитить дочерние пути от неавторизованных пользователей, нам также необходимо использовать CanActivate guard.
Используйте CanLoad перед загрузкой AdminModule:
После загрузки AdminModule в модуле AdminRouting мы можем использовать CanActive для защиты детей от неавторизованных пользователей, как показано ниже:
источник
canActivate, если неавторизованный пользователь входит, по-прежнему загружает этот модуль. вам понадобится canLoad, чтобы решить, нужно ли его загружать.
источник
Важно отметить, что canLoad никому не помешает получить ваш исходный код. .Js не будет загружен браузером, если пользователь не авторизован, но вы можете принудительно выполнить загрузку вручную, выполнив импорт ('./ xxxxx.js') в консоли браузера.
Имя модуля можно легко найти на main.js в определении маршрутов.
источник