Angular 8身份验证防护-确定用户是来自应用程序的外部还是来自应用程序内部

问题描述 投票:0回答:1

似乎是一个愚蠢的问题,但由于某种原因,我无法弄清楚答案。

我有一个身份验证卫士,它检查存储在本地存储中的JWT令牌的到期并引发“您的会话已过期”对话框,该对话框将用户重定向为登录onClose。

在当前状态下,仅当浏览器在存储中具有此令牌时,才会引发对话框;否则,它将直接重定向到登录页面。

canActivate(
    next: ActivatedRouteSnapshot,
    state: RouterStateSnapshot): boolean {
    if (!this._auth.isAuthenticated()) {
      if (this._auth.hasToken()) {
        this._dialogService.openErrorDialog('Your session has expired, please re-login', 0)
          .afterClosed()
          .subscribe(() => this.navigateToLogin(state.url));
      } else {
        this.navigateToLogin(state.url);
      }
      return false;
    }
    return true;
  }

我想实现以下逻辑:当用户在某个应用页面上浏览时令牌已过期->用户导航至另一页面->抛出对话框->重定向至登录;但是,如果用户从outside

导航到应用程序中的某个页面,则即使浏览器本地存储中已经存在过期的令牌,也应直接将登录页面重定向到他,而不会引发对话框。

[我试图破解一些基于this的解决方案,但没有成功-尽管我可以从canActivate函数返回Observable<boolean>,但我不知道如何制作rxjsmap]处理pairwise的结果-因此我可以使用先前URL的存在来确定用户来自何处。

非常感谢任何帮助。

似乎是一个愚蠢的问题,但由于某种原因,我无法弄清楚答案。我有一个身份验证卫士,它检查存储在本地存储中的JWT令牌的到期并抛出“您的会话具有...

angular angular2-routing angular8 rxjs6 angular-router-guards
1个回答
0
投票

为您创建了stackblitz示例。使用您在link中共享的信息并创建了如下服务。

@Injectable({ providedIn: "root" })
export class FirstVisitService {

  readonly isFirstVisit = new BehaviorSubject<boolean>(true);

  constructor(router: Router) {
    router.events
      .pipe(
        filter(event => event instanceof NavigationEnd),
        first()
      )
      .subscribe((e: NavigationEnd) => {
        this.isFirstVisit.next(false);
        this.isFirstVisit.complete();
      });
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.