CanActivate

时间:2017-08-05 16:10:00

标签: angular typescript angular2-routing

我试图找到一种方法来管理用户在我的角度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 }
        }
    ])
  • Uris是一个具有URL静态属性的类。
  • CanActivate:在每种情况下,它们都指向一个const变量,该变量包含一个包含激活器的数组。
  • 同样的决心。

以下是负责验证角色的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属性中收到该值。有任何想法吗 ?因为我在文档中一直在研究它,做测试但没有提出替代工作。

我很感激你的帮助。

提前致谢,

路易斯。

0 个答案:

没有答案