我正在使用服务器端的NodeJS
和客户端的Angular 2
构建Web应用程序。
在应用程序中,我使用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
返回用户的数据,还是应该为经过身份验证的用户使用公共参数?
(例如,在currentUser
中制作public
参数AuthService
,然后只使用authService.currentUser
?)
答案 0 :(得分:0)
您不需要将AuthService
注入每个组件。除非用户已经过身份验证,否则您要做的是保护应用程序中的各种路由不被激活。您必须实施AuthGuard
注入AuthService
。{/ p>
查看https://angular.io/docs/ts/latest/guide/router.html(搜索&#34页面;保护管理员功能和#34;)以获取更多信息。