【问题标题】:Angular 5 CanActivate only if user Object returnedAngular 5 CanActivate 仅在用户对象返回时
【发布时间】:2018-03-27 21:20:26
【问题描述】:

我有一个 AuthService 提供 loggedIn() 函数,如果登录则返回 true,否则返回 false。但是,我使用 JWT 是为了让用户保持登录状态。由于我不仅想检查 JWT 是否过期,还想检查此 Token 是否适合用户,我验证(如果令牌是存储在本地Storage)这个。我如何返回一个简单的真或假?我尝试过这样的事情:

授权服务:

loggedIn(): Observable<boolean> {
    const token = this.loadToken();
    if (token) {
        const headers = this.server.createAuthHeaders(null, null, token);
        const httpOptions = {
            headers
        };
        return this.http.get(url, httpOptions)
        .map(user => typeof(user) === 'object')
        .catch(err => Observable.of(false));
    }
    return Observable.of(false);
}

和 AuthGuard:

canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
    return this.authService.loggedIn().map((loggedIn) => {
        if (!loggedIn) {
            this.router.navigate(['/login']);
            return false;
        } else {
            return true;
        }
    }).take(1);
}

【问题讨论】:

  • CanActivate 守卫可能返回一个 Observable。这就是你应该返回的。不是布尔值,因为您需要一个异步 http 调用,它返回...一个 Observable。
  • 我该怎么做?我用 AuthGuard 更新了问题
  • 您可以查看 Observable.of() ,这是一种简单的方法。编辑:我刚刚注意到您的 loggedIn 方法的代码,该代码永远不会起作用,因为 bool 的值将始终为 false。您使用同步方法编写代码,但 http.get 是异步的。
  • 谢谢!您能否提供一个代码示例来说明您将如何实现这一点?

标签: angular rxjs


【解决方案1】:

loggedIn 应该返回一个Observable&lt;boolean&gt;

只需将其代码更改为

  loggedIn(): Observable<boolean> {
    const token = this.loadToken();
    if (token) {
      return this.http.get(url, httpOptions)
        .map(user => isObject(user))
        .catch(err => Observable.of(false));
    }
    return Observable.of(false);
  }

【讨论】:

  • 我得到两个错误:属性'map'不存在于类型'Observable'属性'of'不存在于类型'typeof可观察的'。我需要在 AuthGuard 上进行任何更改吗?
  • map 是一个 RxJS 操作符。与任何其他运算符一样,它必须被导入。就像您可能已经在 AuthGuard 中所做的那样:import 'rxjs/add/operator/map';。 of 是静态创建方法,也必须导入:import 'rxjs/add/observable/of';
  • 仍然出现错误 :( src/app/services/auth.service.ts(65,7) 中的错误:错误 TS2322:类型 'Observable' 不是可分配给类型'Observable' 类型'boolean | {}'不可分配给类型'boolean'。类型'{}'不可分配给类型'boolean'。src/app/services/auth.service.ts (67,34): error TS2339: Property 'of' does not exist on type 'typeof Observable'. src/app/services/auth.service.ts(69,23): error TS2339: Property 'of' 不存在在类型'typeof Observable'上。。我必须使用地图还是也可以使用订阅?
  • 第一个错误可能意味着 isObject 没有返回应有的布尔值。第二个已经在我之前的评论中回答了。
  • 我刚刚更新了我的问题。编译时没有更多错误。非常感谢!
猜你喜欢
  • 2018-08-12
  • 1970-01-01
  • 1970-01-01
  • 2017-12-20
  • 1970-01-01
  • 1970-01-01
  • 2017-08-22
  • 2021-08-28
  • 2018-12-19
相关资源
最近更新 更多