【问题标题】:Angular 2 proper use of authentication serviceAngular 2 正确使用身份验证服务
【发布时间】:2017-06-11 06:02:45
【问题描述】:

我正在使用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 返回用户的数据,还是应该为经过身份验证的用户使用公共参数? (例如在AuthService 中设置currentUser 参数public 然后只使用authService.currentUser?)

【问题讨论】:

  • 你曾经能够让它工作吗?如果可以,您可以分享您的解决方案吗?

标签: node.js angular authentication passport.js


【解决方案1】:

您不需要将AuthService 注入每个组件。相反,您要做的是保护应用程序中的各种路由不被激活,除非用户已通过身份验证。您必须实现一个AuthGuard,该AuthService 将被注入。

查看https://angular.io/docs/ts/latest/guide/router.html(搜索“保护管理员功能”页面)了解更多信息。

【讨论】:

  • 我的应用程序中确实有守卫,但守卫只保护您的路线,这不是我想要的。正如我在问题中提到的,我需要在组件本身中获取用户数据,而不仅仅是为了保护路由。例如,用户模型包含权限,我想显示它有哪些权限。
  • 明白。将 AuthService 注入到每个需要访问它的组件中是一种方法。或者,您可以创建一个抽象的基础组件来处理从 AuthService 检索权限信息。然后,任何需要此信息的组件都可以从基础组件继承。
猜你喜欢
  • 1970-01-01
  • 2017-01-13
  • 2017-11-19
  • 1970-01-01
  • 2017-02-24
  • 2017-10-27
  • 2011-09-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多