星云角色 - isGranted() 始终为真

Nebular Roles - isGranted() always true

晚上好,

我正在配置 Nebular 以使用角色。服务器端一切正常,前端一切正常,但 accessControl.isGranted() 始终 returns 正确。这是我正在使用的一些代码:

角色定义:

@NgModule({

  imports: [
   // ...

   NbSecurityModule.forRoot({
     accessControl: {
       guest: {
         view: [],
       },
       worker: {
         parent: 'guest',
         view: ["home", "profile", "tools"],
       },
       customer: {
         parent: 'guest',
         view: ["home"],
       },
       manager: {
         parent: 'guest',
         view: '*',
         create: '*',
         remove: '*',
       },
     },
   }),

 ],

角色提供者

这和Nebular网站完全一样

  getRole(): Observable<string> {
    return this.authService.onTokenChange()
      .pipe(
        map((token: NbAuthJWTToken) => {
          // console.log(token.getPayload()['role']) shows the expected role
          return token.isValid() ? token.getPayload()['role'] : 'guest';
        }),
      );
  }

导入和提供程序配置为 https://akveo.github.io/nebular/docs/security/acl-configuration--usage#role-provider

无效的代码

我需要根据角色隐藏一些侧边栏条目,所以我在 routing.module.ts:

this.menu = 
{
  // ....
  {
    path: "home",
    component: "HomeComponent",
    hidden: !accessChecker.isGranted('view', 'home'),
  },
  {
    path: "tools",
    component: "adminPanelComponent",
    hidden: !accessChecker.isGranted('view', 'tools'),
  },
  {
    path: "admin",
    component: "adminPanelComponent",
    hidden: !accessChecker.isGranted('view', 'admin'),
  }
  // ....
}

问题是菜单项总是可见的,所以 isGranted 总是以某种方式为真。 有什么问题?

谢谢!

我发现在 HTML 上使用了管道 async。在组件代码中我不能使用这个管道所以我必须使用订阅来正确获取值。我真的不想使用订阅,但因为我不得不想出这个解决方案:

this.accessChecker.isGranted("view", "admin")
.pipe( take(1) )
.subscribe( (granted: boolean) => {
  hide_admin_menu = !granted;
});

....
....

this.menu = [
  {
    title: ...,
    icon: ...,
    hidden: hide_admin_menu,
  },

  ....
  ....
]

现在一切正常,但我觉得这仍然不是 best/most 优雅的解决方案。