Angular 2正确使用身份验证服务

时间:2017-01-25 21:34:46

标签: node.js angular authentication passport.js

我正在使用服务器端的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?)

1 个答案:

答案 0 :(得分:0)

您不需要将AuthService注入每个组件。除非用户已经过身份验证,否则您要做的是保护应用程序中的各种路由不被激活。您必须实施AuthGuard注入AuthService。{/ p>

查看https://angular.io/docs/ts/latest/guide/router.html(搜索&#34页面;保护管理员功能和#34;)以获取更多信息。