【问题标题】:Angular Universal: Get Store in Guard on Server-side using NgRxAngular Universal:使用 NgRx 在服务器端获取 Store in Guard
【发布时间】:2020-06-17 18:54:08
【问题描述】:

我正在运行一个使用 NgRx 进行状态管理的 Angular 9 Universal 应用程序。 我还使用 ngrx-store-localstorage 将 Store 持久化到用户的 localStorage 中。

我正在尝试在使用 Guard 中的 NgRx 访问某些路由之前检查用户是否已登录:

  canActivate(
    next: ActivatedRouteSnapshot,
    state: RouterStateSnapshot): Observable<boolean | UrlTree> | Promise<boolean | UrlTree> | boolean | UrlTree {

    if (isPlatformBrowser(this.platformId)) {
      console.log('browser')
      return this.store.select('user').pipe(
        map(authUser => {
          if (!authUser.id || !authUser.token) {
            console.log(authUser)
            this.router.navigate(['/login'])
            return false
          }
          return authUser.id ? true : false;
        }))
    }
    console.log('server')
    this.router.navigate(['/login'])
    return false
  }

我正在进行平台检查,因为我的服务器无权访问商店。 但这会产生不必要的行为,因为它会检查两次,有时会在呈现受保护的页面之前呈现登录页面。

您是否知道让我的服务器知道当前状态的方法或验证我的用户是否已通过身份验证的替代方法?

【问题讨论】:

  • 澄清一下,private store: Store的构造函数中有一个召唤,而export上方有一个@Injectable注解,请确认
  • 是的,当然!一切都在那里,我确实在浏览器/服务器上打印了 console.log。
  • 我目前正在考虑在我的前端为我的 jwt 设置一个 cookie。我认为 express-engine 将可以访问该值。
  • 也许你还是应该试一试,但我怀疑商店的实现(看起来没问题)是这里的根本原因,因为谷歌上的“ssr双重渲染”搜索会需要考虑很多

标签: angular ngrx angular-universal ngrx-store angular-guards


【解决方案1】:

我最终使用了 ngx-cookie 插件,它使我的守卫能够访问浏览器和服务器上的 cookie:https://github.com/ngx-utils/cookies#servermodulets

我的后卫现在是这样的:

    canActivate(
        next: ActivatedRouteSnapshot,
        state: RouterStateSnapshot): Observable<boolean | UrlTree> | Promise<boolean | UrlTree> | boolean | UrlTree {
        if (isPlatformBrowser(this.platformId)) {
          var token = this.cookies.getObject('_avoSession')
          if (!token) {
            this.router.navigate(['/login'])
            return false
          }
          console.log(token)
          return true

        }
        if (isPlatformServer(this.platformId)) {
          let cookie = this.cookies.getObject('_avoSession')
          if (!cookie) {
            this.router.navigate(['/login'])
            return false
          }
          return true 
        }

  }

这里的 platformCheck 没用,因为我的服务器和浏览器都可以访问 cookie,但是如果您需要一些模块化并为不同的用例添加特定的检查,它会很有用。

您还可以按照此示例 here 使用 Observables 来验证您的 jwt。

【讨论】:

  • 由于你使用的是支持 SSR 的ngx-cookie,你甚至不需要平台检查(你基本上得到了上面相同的代码的两倍)
  • 是的,我在下面提到过;)
  • 对不起,我错过了!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-01
  • 2018-05-08
  • 2017-04-27
  • 2019-01-19
  • 1970-01-01
  • 2017-11-22
  • 1970-01-01
相关资源
最近更新 更多