2017-01-25 6 views
0

私は、サーバー側のためにNodeJSとクライアント側のためにAngular 2を使用してWebアプリケーションを構築しています。角2認証サービスの適切な使用

私はADFSを使用してユーザーを認証しています。

ユーザはウェブサイトを閲覧し、自動的にADFS認証サーバにリダイレクトされます。ユーザーが認証を完了すると、彼は私のアプリケーションにリダイレクトされ、ユーザーデータはADFSサーバーから取得されます。

passport-samlパッケージを使用して認証を実装しても問題ありません。 ユーザーはreq.userに保存されます。

私はクライアント側でユーザーのデータを使用する必要があります。

は少し研究した後、私は、サーバーからクライアントへのユーザーのデータを渡すことと同じくらい簡単することができることを見出し:

router.get('/user/current', AuthMiddleware.requireLogin, (req: express.Request, res: express.Response) => { 
    return res.json(req.user); 
}); 

これも同様に動作します。クライアント側のために今

: は私が認証されたユーザを取得するサービスを作成しました:

@Injectable() 
export class AuthService { 
    private authUrl = 'http://localhost/api/user/current'; 
    private currentUser: User; 

    constructor(private http: Http) { 
     this.getUser().subscribe(user => { 
      this.currentUser = user; 
     }); 
    } 

    getUser(): Observable<User> { 
     return this.http.get(this.authUrl) 
      .map((res: Response) => res.json()) 
      .catch(error => Observable.throw(error.json().error || 'Server Error')); 
    } 

    isAuthenticated(): boolean { 
     return !!this.currentUser; 
    } 
} 

のでgetUser方法は、私のユーザーとObservableを返し、私は私のクライアント - でそれを使用することができます側。

しかし、私の質問は:

は、私は、認証されたユーザーを使用する各コンポーネントにAuthServiceを注入すべきか? その場合は、毎回getUserに電話をかけ、Observableがユーザーのデータを返すのを待つか、認証されたユーザーにpublicパラメーターを使用する必要がありますか? (例えばAuthServicecurrentUserパラメータpublicを作り、その後、ちょうどauthService.currentUserを使うのか?)

答えて

0

あなたは、各コンポーネントにAuthServiceを注入する必要はありません。あなたが代わりにやりたいことは、ユーザーが認証されていない限り、アプリケーションのさまざまなルートをアクティブ化から保護することです。 AuthServiceを注入するAuthGuardを実装する必要があります。

詳細については、https://angular.io/docs/ts/latest/guide/router.html(「ガードアドミニストレーション機能」のページで検索)をご覧ください。

+0

私のアプリケーションではガードがありますが、ガードはルートを保護するだけで、これは私が探しているものではありません。私がこの質問で述べたように、ルートを保護するだけでなく、コンポーネント自体にユーザーのデータを取得する必要があります。たとえば、ユーザーモデルにはアクセス許可が含まれており、そのアクセス許可がどのようなアクセス許可を表示したいのですか。 – Ron537

+1

。それにアクセスする必要のある各コンポーネントにAuthServiceを注入することは、一つの方法です。また、AuthServiceからの許可情報の取得を処理する抽象基本コンポーネントを作成することもできます。この情報を必要とするコンポーネントは、ベースコンポーネントから継承できます。 –