【问题标题】:conditionally render component angular4有条件地渲染组件 angular4
【发布时间】:2018-09-13 03:19:48
【问题描述】:

我需要在我的应用程序中使用基于 owin 的身份验证来实现 SSO 登录和外部登录。如果用户是 sso(单点登录)类型用户,他将登陆仪表板组件,如果不是,则他将登陆登录组件。

为此,我在 ngInit 事件上从应用组件向我的 webapi 发出请求,以获取用户详细信息(令牌、用户访问权限、组和角色等)。

根据 webapi 信息,我在仪表板组件或登录组件中对其进行导航。

我能够实现我的目标,但这并不符合我的预期,因为如果用户是 SSO 类型,他可以在仪表板上导航,但在此之前,他还可以看到登录屏幕,因为它已经在我的路由表中app.routingmodule.ts 文件。

我有两个问题需要帮助-

1) 根据我的 API 响应呈现适当组件的最佳方式是什么?

2) 成功登录后管理用户数据(如用户详细信息、权限、access_token)的最佳方法是什么,我应该使用 sessionStorage 还是其他方式?

我的路由代码为-

const fidsRoutes: Routes = [
    { path: '', redirectTo: 'login', pathMatch: 'full' },
    { path: 'login', component: LoginComponent },
    { path: 'dashboard', component: DashBoardComponent }
  ];

我的应用组件 ngOnInit 事件作为-

ngOnInit() {

this.authenticationservice.userLogin(this.loginData)
   .subscribe(
   res => {
     if (res.access_token != null) {
       this.userDetails = res;

       sessionStorage.setItem('access_token', this.userDetails.access_token);
       sessionStorage.setItem('userId', <any>this.userDetails.Id);
       //const session = sessionStorage.getItem('access_token');

      // this.screenName = this.userDetails.Screen.split("~");
       //this.routeScreen = this.userDetails.Route.split("~");
       sessionStorage.setItem("UserId", <any>this.userDetails.Id);

       sessionStorage.setItem("MenuDataScreen", this.userDetails.Screen);

       sessionStorage.setItem("MenuDataRoute", this.userDetails.Route);

       this.router.navigate(['dashboardcomponent']);
     } 

     else {
       this.router.navigate(['logincomponent']);
     }
   },
   err => {
     this.router.navigate(['logincomponent']);
   }
   );
  }

}

【问题讨论】:

标签: angular typescript angular2-routing angular2-template angular2-directives


【解决方案1】:

在 cmets 中回答了 1:使用路线守卫。我想添加官方指南:https://angular.io/api/router/CanActivate

2) 将令牌存储在 cookie、会话或本地存储中是可以的,只要令牌在服务器端具有相当短的到期时间。不要在本地任何地方保存任何敏感的用户数据,这是不安全的。

【讨论】:

  • 如果它不安全,那么我在哪里可以在 Angular 4 应用程序中保存敏感数据?
  • 我会说任何敏感数据(以及任何可以以任何方式以持久方式识别用户的任何数据,例如用户 ID)仅在 JS 内存中。如果用户在有效期间重新访问,只需使用令牌再次获取数据。
  • 令牌是安全的(如果在服务器上正确实施),因为它们每次都是唯一的,只要它们的有效期很短。
  • 我需要根据角色权限管理一些用户详细信息,例如用户名和菜单项,因此我可以将这些内容保存在哪里,因为我不想一次又一次地加载标题项。我还需要在重新加载应用程序时管理这些事情。我应该使用 NGRX 商店吗?
  • 如果用户重新加载应用程序,NGRX 也不会保留任何内容。我不会担心这一点,因为它很少见,没有人需要强制重新加载。如果他们这样做了,只需使用令牌重新加载敏感数据。最安全的方法是将用户名之类的内容仅保留在内存中 - 所以 ngrx 或只是一个服务。
猜你喜欢
  • 2019-02-18
  • 1970-01-01
  • 2018-12-20
  • 1970-01-01
  • 2022-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-30
相关资源
最近更新 更多