0

我的应用程序的某些部分需要用户验证,这可以自动完成(使用存储为 cookie 的现有刷新令牌)或使用登录表单手动完成。

虽然我可以使用 Service 来实现这一点,但它感觉相当 hackish(各种服务旨在返回数据)。但我想不出更好的方法来在不同控制器之间共享功能。

PS 我确实检查了https://github.com/witoldsz/angular-http-auth但捕获 401 错误并启动登录意味着我会打一个额外的电话,即使我知道它会失败。

4

2 回答 2

3

我认为您绝对可以将登录过程分解为服务,因为在应用程序中存储信息并将信息传递给各种控制器非常重要,而这正是服务的用途。

我使用与您指出的链接类似的东西创建了一个错误报告应用程序,但我也使用服务和控制器对其进行了自定义。这些是我在设置时遵循的步骤:

  • 首先,我设置了拦截器来捕获 401 错误并广播一条需要登录的消息。

  • 然后我设置了一个 authService 来记录所有那些糟糕的 401 调用。如果有错误的呼叫,它会被存储。

  • 我还有一个登录控制器,它也使用 authService 来处理表单、注​​册、登录、注销等。控制器用于每个页面的菜单中,因此不会错过广播事件。我的控制器监听广播事件,并在收到时显示登录表单。

  • 成功登录后,我告诉我的 authService 重复所有存储的调用并删除它们。

现在这很好用,但是如果有人刷新页面, authService 被删除,拦截器将不得不重新完成所有工作,事件将需要广播,最终会很痛苦。为了克服这个问题,我在我的登录控制器中做了一个简单的检查。

  • 首先只需检查 authService 是否存储了用户对象。

  • 如果没有,请与服务器检查,如果结果是用户已登录,则再次填充 authService。

  • 如果用户没有登录,什么也不做,但是让 authService 知道你已经检查了服务器并看到用户没有登录。

同样,就我而言,我不想强​​迫用户登录,除非他们试图执行需要登录的特定操作。作为一个错误报告应用程序,我希望允许匿名用户阅读内容,但一旦他们要发布,就必须注册或登录。

如果您的案例涉及 100% 的时间登录,您可以完全忽略拦截器。只需设置一个服务和一个控制器。如果登录控制器发现 authService 未填充,则重定向到登录屏幕。刷新后,对服务器进行简单检查以确保它们仍处于登录状态,否则重定向到登录屏幕。

于 2013-05-08T16:56:56.930 回答
3

在这种情况下,服务非常合适。正如本视频中关于最佳实践的描述,服务与“获取数据”无关,因为它是将逻辑与控制器分离。控制器说做什么,服务说怎么做。

因此,在您的情况下,控制器说“我需要检查用户是否经过身份验证”但要知道如何做到这一点,这取决于服务。

这也完全符合数据收集的概念。控制器说“我需要获取所有员工信息”。服务定义了如何。

他在这次会议上特别表示,每当需要在控制器之间共享信息时,服务几乎总是最好的方式。

于 2013-05-08T17:45:58.487 回答