我试图找到一种方法来管理用户在我的角度2应用程序中的角色,而无需编写大量代码。我在网上找到了一个目前为止工作正常的解决方案。考虑到我省略了部分设置以减少混淆,无论如何,这里是我的模块中@NgModule下的设置,用于应用程序特定部分所涉及的路径:
RouterModule.forChild([
{
path: Uris.LogCall,
component: LogCallComponent,
canActivate: moduleActivator,
data: { roles: ['ROLE_ADMIN','ROLE_SUPERVISOR'] }
},
{
path: Uris.ED,
component: EdComponent,
canActivate: formActivators,
data: { roles: ['ROLE_ADMIN','ROLE_SUPERVISOR'] }
},
{
path: Uris.Community,
component: CommunityComponent,
canActivate: formActivators,
data: { roles: ['ROLE_ADMIN','ROLE_SUPERVISOR'] }
},
{
path: Uris.Lab,
component: LabComponent,
canActivate: formActivators,
data: { roles: ['ROLE_ADMIN'] }
},
{
path: Uris.In,
component: InComponent,
canActivate: formActivators,
data: { roles: ['ROLE_SUPERVISOR'] }
},
{
path: Uris.Consult,
component: ConsultComponent,
canActivate: formActivators,
data: { roles: ['ROLE_ADMIN','ROLE_SUPERVISOR']}
},
{
path: Uris.BW,
component: BWComponent,
canActivate: BWActivators,
data: { roles: ['ROLE_ADMIN','ROLE_SUPERVISOR']}
resolve: { form: BWLFormResolver }
},
{
path: Uris.BWL,
component: BWLComponent,
canActivate: BWActivators,
data: { roles: ['ROLE_ADMIN','ROLE_SUPERVISOR']},
resolve: { form: BWLFormResolver }
}
])
以下是负责验证角色的CanActivate:
@Injectable()
export class AuthGuardByRole implements CanActivate {
constructor(
private readonly authService: AuthService,
private readonly router: Router
) { }
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> | boolean {
const roles = route.data['roles'] as Array<string>;
if (roles && this.authService.isAuthenticated()) {
return roles.indexOf(this.authService.User.role) !== -1;
} else {
this.router.navigate(['landing']);
}
}
}
这对所有人都有效,直到我添加了解析,即使解析正常,最后两个解决方案中最后一个代码中的roles变量总是未定义的。但对于其余的URL(没有解决方案),它工作得很完美,角色总是有效的。我提到决心,因为我认为这可能是原因,我不确定是诚实的。
解析器
@Injectable()
export class BWListFormResolver implements Resolve<BWListForm> {
constructor(private readonly service: LogService) { }
resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<BWListForm> {
const id = Number(route.paramMap.get('id'));
return this.service.getBWList(id);
}
}
我阅读了文档,根据我的理解,我应该在data属性中收到该值。有任何想法吗 ?因为我在文档中一直在研究它,做测试但没有提出替代工作。
我很感激你的帮助。
提前致谢,
路易斯。