2017-11-07 11 views
0

私は運がない解決策を探していました。ユーザーが承認されていればサーバーを呼び出す必要があり、その呼び出しの結果を待つメソッドをcanActivateする必要があります。しかし、私は一緒に作品を置くことはできません。以下は私のコードです、私の質問はコードのコメントです。canActivateメソッドからObservable <boolean>を返し、falseにリダイレクト

canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> { 

    let user: EUser = new EUser(); 
    user.sessionId = localStorage.getItem("sessionId"); 

    //I am not sure how to implement this part. 
    // I need to recieve the response and get user.isAuthorized value and return it 
    // as an observable. 
    this.authenticationService.isAuthorized(user).subscribe((user)=>{ 
     //Here i need to get user.isAuthorized and 
     //if the value is false, i need to navigate to login with this.router.navigate['login'] and return it. 
     //if the values it true, i need the code continue as it is. 
    }); 

    } 

AuthenticationService

isAuthorized(user:EUser){ 
    return this.http.post(ConnectionHelper.SERVER_URL+ 
      ConnectionHelper.USER+ConnectionHelper.ISAUTHORIZED,user).map(res => res.json()); 
} 
+0

バックエンドの応答はどのように見えますか? –

+0

username、sessionId、isAuthorizedフィールドを持つjsonオブジェクト。 @ Jota.Toledo – rematnarab

答えて

1

あなたのアプローチが正しいか、あなただけのbool値に対するサーバの応答をマップする必要があります。例:

export interface AuthState { 
    username:string; 
    sessionId:string; 
    isAuthorized:boolean; 
} 

isAuthorized(user:EUser): Observable<AuthState> { 
    return this.http.post(ConnectionHelper.SERVER_URL+ 
      ConnectionHelper.USER+ConnectionHelper.ISAUTHORIZED,user) 
    .map(res => res.json()); 
} 

// Inject Router instance in the constructor of the guard class 
// import required rxjs operators 
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> { 
    let user: EUser = new EUser(); 
    user.sessionId = localStorage.getItem("sessionId"); 
    return this.authenticationService.isAuthorized(user) 
    .map(user => user.isAuthorized) 
    .do(auth => { 
     if(!auth){ 
     this.router.navigate(['/login']); 
     } 
    }); 
} 
+0

迅速な対応に感謝します。このアプローチで私は私が尋ねることを忘れた何かを欠けていると思う:)。 user.isAuthorizedがfalseの場合、ユーザーをログインページにリダイレクトする必要があります。 (this.router.navigate ['login']) – rematnarab

+0

私は元の質問を編集しました。 – rematnarab

+0

@rematnarabが更新されました –

関連する問題