【发布时间】:2020-07-10 14:56:05
【问题描述】:
好的,我有一条路线:站点/仪表板/订单
{
path: 'dashboards',
loadChildren: () => import('./dashboards/dashboards.module').then(m => m.DashboardsModule),
canActivate: [AuthGuard, NgxPermissionsGuard],
data: {
permissions: {
only: ['admin', 'dashboards'],
redirectTo: 'homepage'
}
}
}
在我的应用程序组件中,我检查用户是否经过身份验证,如果是,则从 api 获取角色并使用 NgxPermissions 模块加载权限
app.component.ts(在构造函数中):
constructor(private services) {
this.checkAuth();
}
checkAuth() {
apiService.checkAuth().subscribe((value: boolean) => {
if (value) {
// get roles with another api call
apiService.getRoles().subscribe(roles => {
this.permissionsService.loadPermissions(roles);
});
}
});
}
我知道这不是在另一个订阅中进行订阅的最佳方式,但现在这无关紧要。
如果我从第一页访问该网站,则问题不存在,因为:
转到站点/主页 => checkAuth() 已执行并有足够的时间 获取 api 结果 => 加载角色
导航到仪表板/订单 => 角色已从 上一步(如果我不导航太快)和路由时转到 路径“仪表板”并仅检查具有权限的数据 ['admin', 'dashboards'],这将允许我访问路线,因为 角色存在。
但是,如果我尝试直接访问网站/仪表板/订单:
- app.component.ts 是 Angular 中第一个加载的组件,所以会调用 checkAuth() 方法。但是因为这是一个可观察的,将传递给 完成之前的下一步操作(检查路由数据权限)。 由于未加载角色,该应用会将我重定向到“主页”。
如何在访问路由和验证权限之前等待加载角色?
我只需要获得一次角色(在第一次访问应用程序时),而不是每个路由模块。是否可以在路由模块中监听 observables?
很快,我需要在路由之前加载角色。
谢谢
【问题讨论】:
标签: angular redirect permissions routing roles