在Ember.JS应用程序中强制执行用户/身份验证状态的最佳方法

时间:2012-09-05 00:02:26

标签: authentication ember.js

使用我的第一个EmberJS应用程序。整个应用程序要求用户登录。我试图绕过最好的方法来强制用户现在登录(当页面最初加载时)和将来(当用户是退出并且没有刷新)。

我已经处理了用户身份验证挂钩 - 现在我有一个ember-data模型和连接该句柄的相关商店,授权用户并创建用户" session" (使用sessionStorage)。

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

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

修改 我最终做了一些我认为更尴尬的事情,虽然可能是一个混乱的实现。我有一个auth statemanager,用于存储当前用户的身份验证密钥以及当前状态。

每当需要身份验证时,它只会向authmanager请求它并传递回调函数以使用身份验证密钥运行。如果用户未登录,则会提取登录表单,暂停回调功能,直到用户登录为止。

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

4 个答案:

答案 0 :(得分:8)

如果您需要在初始状态转换之前执行检查,Ember.Application类上有一个名为deferReadiness()的特殊功能。来自源代码的评论:

  

默认情况下,路由器将开始尝试将当前网址转换为     浏览器发出DOMContentReady事件后的应用程序状态。如果你     需要推迟路由,您可以调用应用程序的deferReadiness()方法。     路由开始后,请调用advanceReadiness()方法。

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

中可用

答案 1 :(得分:3)

在重新检查路由转换之间的身份验证方面,您可以为enter的{​​{1}}和exit方法添加挂钩:

Ember.Route

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

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

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');
            }
        }),
        ....
    })
});

如果您使用上述解决方案,那么您可以准确地选择您认证的路线。您也可以删除“检查他们是否转换到登录屏幕”,然后选中App.AuthenticatedRoute = Ember.Route.extend({ enter: redirectToLogin }); App.Router = Ember.Router.extend({ root: Ember.Route.extend({ index: App.AuthenticatedRoute.extend({ ... }) }) });

答案 2 :(得分:2)

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

答案 3 :(得分:1)

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

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

感谢。