37

开发我的第一个 EmberJS 应用程序。整个应用程序要求用户登录。我试图围绕强制用户现在(最初加载页面时)和将来(当用户注销时)登录的最佳方式并且没有刷新)。

我已经处理了用户身份验证挂钩 - 现在我有一个 ember-data 模型和关联的存储,它连接处理授权用户和创建用户“会话”(使用 sessionStorage)。

我不知道如何做的是强制用户在跨路由转换时进行身份验证,包括根路由中的初始转换。我把这个逻辑放在哪里?如果我有一个身份验证状态管理器,我如何将它连接到路由中?我应该有一个根路由之外的身份验证路由吗?

注意:如果这个问题措辞不当或者我需要更好地解释什么,请告诉我,我很乐意这样做。

编辑: 我最终做了一些我认为更像灰烬的事情,尽管可能是一个混乱的实现。我有一个身份验证状态管理器,它存储当前用户的身份验证密钥以及当前状态。

每当有东西需要身份验证时,它只需向 authmanager 请求它并传递一个回调函数以使用身份验证密钥运行。如果用户没有登录,它会拉出一个登录表单,在用户登录之前暂停回调函数。

这是我正在使用的代码的一些选择部分。需要清理,我遗漏了一些东西。http://gist.github.com/3741751

4

4 回答 4

8

如果您需要在初始状态转换之前执行检查,则Ember.Application类上有一个特殊功能,称为deferReadiness(). 源代码中的注释:

默认情况下,一旦浏览器发出DOMContentReady事件,路由器就会开始尝试将当前 URL 转换为应用程序状态。如果需要延迟路由,可以调用应用程序的deferReadiness()方法。一旦可以开始路由,调用该advanceReadiness()方法。

请注意,在撰写本文时,此功能仅在ember-latest中可用

于 2012-10-08T14:15:26.053 回答
3

在重新检查路由转换之间的身份验证方面,您可以在 的enterexit方法中添加钩子Ember.Route

var redirectToLogin = function(router){
    // Do your login check here.
    if (!App.loggedIn) {
        Ember.run.next(this, function(){
            if (router.currentState.name != "login") {
                router.transitionTo('root.login');
            }
        })
    }
};

// Define the routes.
App.Router = Ember.Router.extend({
    root: Ember.Route.extend({
        enter: redirectToLogin,
        login: Ember.Route.Extend({
            route: 'login',
            exit: redirectToLogin,
            connectOutlets: function(router){
                router.get('applicationController').connectOutlet('login');
            }
        }),
        ....
    })
});

这种解决方案的问题在于,Ember 实际上会在转换回您的登录路由之前转换到新路由(并因此加载所有数据等)。因此,这可能会暴露您不希望他们再看到的应用程序的某些部分。然而,现实情况是所有这些数据仍然加载在内存中,并且可以通过 JavaScript 控制台访问,所以我认为这是一个不错的解决方案。

还要记住,由于 Ember.Route.extend 返回一个新对象,您可以创建自己的包装器,然后在整个应用程序中重用它:

App.AuthenticatedRoute = Ember.Route.extend({
    enter: redirectToLogin
});
App.Router = Ember.Router.extend({
    root: Ember.Route.extend({
        index: App.AuthenticatedRoute.extend({
            ...
        })
    })
});

如果您使用上述解决方案,那么您可以准确挑选您验证的路线。您还可以删除“检查他们是否正在转换到登录屏幕”签入redirectToLogin

于 2013-01-08T08:06:47.453 回答
2

我整理了一个超级简单的包来管理会话和身份验证,名为 Ember.Session https://github.com/andrewreedy/ember-session

于 2014-02-14T18:09:39.257 回答
1

也请看一下: http ://www.embercasts.com/

那里有两个关于身份验证的截屏视频。

谢谢。

于 2013-07-29T19:37:23.003 回答