- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我遇到了一种奇怪的行为(或者可能是一种被通缉的行为)。我有一个 Angular 应用程序,其中所有模块都是延迟加载的。
在一个模块上,我有一个守卫检查来自 JWT 的解码用户是否是系统管理员。如果是这样,用户应继续该部分,否则将在仪表板中重定向。
奇怪的是,这个东西只在第一次模块加载时起作用。然后,如果我尝试注销并使用不是系统管理员的用户进行访问,则不会触发 CanLoad 守卫。
我还尝试在同一个守卫中实现(CanActivate 和 CanActivateChild)接口(interface),并将守卫放在 app-routing.module.ts
和 feature- routing.module.ts
模块,分别在模块的 CanLoad、CanActivate 和 CanActivateChild 属性上。
CanActivate CanActivateChild 方法从不 被调用。 从不。
虽然放置在 app-routing.module.ts
上的 CanLoad 只被调用一次。
is-sys-adm.guard.ts
文件:export class SFWIsSysAdmGuard implements CanLoad, CanActivate, CanActivateChild {
public constructor(
private readonly accessSvc: SFWAuthService,
private readonly toastSvc: NbToastrService,
private readonly translateSvc: TranslateService,
private readonly navigationSvc: NavigationService,
) { }
public canActivateChild(childRoute: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {
console.log('Can activate child hit');
return this.canLoad(undefined, undefined);
}
public canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {
console.log('Can activate hit');
return this.canLoad(undefined, undefined);
}
public canLoad(route: Route, segments: UrlSegment[]): boolean {
console.log('Can load hit');
const decodedUser = this.accessSvc.decodedUser;
if (!!decodedUser && !!decodedUser.isSystemAdmin) {
return true;
}
this.navigationSvc.goToDashboard();
this.toastSvc.warning(
this.translateSvc.instant('framework.guards.adm_only.access_denied'),
this.translateSvc.instant('common.access_to_section_denied_ttl'),
);
return false;
}
}
app-routing.module.ts
文件:const routes: Routes = [
{
path: '',
redirectTo: `/${AppRoutes.access}`,
pathMatch: 'full'
},
{
path: AppRoutes.dashboard,
loadChildren: () => import('./dashboard/dashboard.module').then(mod => mod.DashboardModule)
},
{
path: AppRoutes.pins,
loadChildren: () => import('./pins/pins.module').then(mod => mod.PinsModule)
},
{
path: AppRoutes.pinTypes,
loadChildren: () => import('./pin-types/pin-types.module').then(mod => mod.PinTypesModule)
},
{
path: AppRoutes.organizationPickup,
loadChildren: () => import('./organization-picker/organization-picker.module').then(mod => mod.OrganizationPickerModule)
},
{
path: AppRoutes.access,
loadChildren: () => import('./access/access.module').then(mod => mod.AccessModule)
},
{
path: AppRoutes.tourism,
loadChildren: () => import('./tourism/tourism.module').then(mod => mod.TourismModule)
},
{
path: AppRoutes.security,
canLoad: [SFWIsSysAdmGuard],
loadChildren: () => import('./security/security.module').then(mod => mod.SecurityModule)
},
{
path: AppRoutes.notFound,
loadChildren: () => import('./not-found/not-found.module').then(mod => mod.NotFoundModule)
},
{
path: '**',
redirectTo: '/404'
}
];
@NgModule({
imports: [RouterModule.forRoot(routes)],
exports: [RouterModule]
})
export class AppRoutingModule { }
feature-routing.module.ts
文件:const routes: Routes = [
{
path: '',
canActivate: [SFWIsSysAdmGuard],
component: SecurityComponent,
children: [
{
path: 'tokens-generator',
canActivateChild: [SFWIsSysAdmGuard],
component: TokensGeneratorComponent
},
]
}
];
@NgModule({
imports: [RouterModule.forChild(routes)],
exports: [RouterModule]
})
export class SecurityRoutingModule { }
@NgModule({
imports: [RouterModule.forChild(routes)],
exports: [RouterModule]
})
export class SecurityRoutingModule { }
在你问之前,我还尝试将守卫单独放在 CanActivate、CanActivateChild、CanLoad 中以试图阻止任何冲突(如果我理解了文档,就不应该存在。)
我错过了什么吗?这是一种被通缉的行为还是我应该在官方 repo 中打开一个错误?
感谢任何愿意花时间在这个<3
上的人最佳答案
CanLoad
决定惰性模块是否可以从服务器加载。加载后,将不会再次检查(除非您按 F5)。我猜你需要声明两次,一次是在 CanLoad
中(如果你根本不想加载代码),一次是在 CanActivate
中,如果你想限制访问权限。
{
path: AppRoutes.security,
canLoad: [SFWIsSysAdmGuard],
canActivate: [SFWIsSysAdmGuard],
loadChildren: () => import('./security/security.module').then(mod => mod.SecurityModule)
},
关于javascript - Angular CanLoad 守卫只在第一次延迟加载时触发一次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57707561/
我如何使用 if 守卫的理解? type Error = String type Success = String def csrfValidation(session:Session,
我试图深入理解 Angular,所以我阅读了 the docs这非常有帮助。 现在我正在研究守卫。我在文档中阅读了此声明。 The router checks the CanDeactivate an
是否可以批量guard's 观看通知? 例如,如果移动了一个子文件夹,watch 会为每个文件发出一个事件。我真正想要的是一个通知,而不是几个,如果有什么变化。 最佳答案 虽然这不是批量更改,因此没有
我正在使用 Guard gem 在开发的某些时候,我只需要跟踪一个特定的文件或几个文件,而不是整个项目。 是否有一些方便的方法来临时跟踪特定文件? 我知道这可以通过修改保护文件来完成,但我认为这不是一
已解决 真正帮助我的是我可以#include .cpp 文件中的 header 而不会导致重新定义的错误。 我是 C++ 新手,但我有一些 C# 和 Java 编程经验,所以我可能会遗漏一些 C++
是否有可能保证在范围退出时完成的变量。 具体来说,我想要一个守卫:在初始化时调用特定函数,并在作用域退出时调用另一个特定函数的东西。 最佳答案 这最好明确地完成: class Guard def
我有一个类型代表我的应用程序的游戏状态,对于这个问题假装它很简单,例如: Game { points :: Int } 我用 State monad 定义我的游戏逻辑。 type GameState
这个问题在这里已经有了答案: Why is GHC complaining about non-exhaustive patterns? (3 个答案) 关闭 7 个月前。 我有以下代码,它定义了一
我知道在头文件中使用 include guards 是为了防止某些东西被定义两次。不过,使用此代码示例完全没问题: foo.c #include #include #include "bar.h"
这个问题在这里已经有了答案: Why is GHC complaining about non-exhaustive patterns? (3 个答案) 关闭 7 个月前。 我有以下代码,它定义了一
我知道 guard 在 Swift 中的作用。我已经阅读了有关使用 guard 或 if let 的问题。但是,guard (condition) else { return } 和if !condi
我正在试验 Xcode 提供的不同分析选项,但是当我在 Diagnostics 选项卡中启用 Guard Malloc 选项并尝试运行时,我收到了这个错误立即崩溃: dyld: could not l
这是我的 canDeactivate 守卫,它可以工作。但是我不想在使用提交按钮时调用守卫。只有当我通过任何其他方式导航时。怎么办? import { Injectable } from '@angu
嗨,这让我发疯。找了半天也没找到解决方法。 如何为 Guardfile 中的所有守卫触发“run_all”。 当我在 shell 中运行“guard”时,我希望它假装所有文件都已更改并触发所有守卫。
我想知道是否有守卫(断言)函数的 golang 命名约定?我用谷歌搜索了一下,但找不到任何确定的东西。我在“The Go Programming Language”一书中读到,使用“必须”前缀是一种常
我正在尝试使用 guard 的 --listen-on带有 vagrant 的选项,如概述 here ,但我无法让它工作。 如果我添加 config.vm.network :forwarded_por
我目前有一个路线守卫,例如 export class EntityGuard implements CanActivate { constructor(private readonly route
我正尝试在 less 中创建一个高度可定制的按钮 mixin。例如,我希望客户能够进入他们的 .less 文件并写入: .my-button { .btn(@bg: #FFF, @font:
这个问题在这里已经有了答案: #pragma once vs include guards? [duplicate] (13 个答案) 关闭 3 年前。 我正在浏览 Implementation d
这个问题在这里已经有了答案: Is #pragma once a safe include guard? (15 个答案) 关闭 3 年前。 我正在开发一个已知只能在 Windows 上运行并在 V
我是一名优秀的程序员,十分优秀!