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

在我的第一个EmberJS应用程序工作。 整个应用程序需要一个用户login。我试图包围我的头周围的最佳方式来强制用户现在login(当页面最初加载时)和将来(当用户注销并没有刷新)。

我有处理用户身份validation挂钩 – 现在我有一个呃数据模型和相关的存储,连接,处理授权用户和创build用户“会话”(使用sessionStorage)。

我不知道该怎么做的是强制用户在跨路由转换时进行身份validation,包括根路由中的初始转换。 我在哪里把这个逻辑? 如果我有一个身份validation状态pipe理员,我该如何将其绑定到路由? 我应该有根路由之外的auth路由吗?

注意:让我知道这个问题措辞不好,或者我需要更好地解释,我会很乐意这样做。

编辑:我最终做了一些我认为更多的呃,尽pipe可能是一个混乱的实现。 我有一个auth statemanager存储当前用户的身份validation密钥,以及当前的状态。

无论什么时候需要身份validation,只需要向身份validationpipe理员请求身份validation,然后传递callback函数以使用身份validation密钥运行。 如果用户没有login,它会拉起login表单,直到用户login为止。

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

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

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

请注意,在撰写本文时,此function仅在最新版本中可用

在路由转换之间重新检查身份validation方面,您可以在Ember.Routeenterexit方法中添加挂钩:

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

这样的解决scheme的问题是,在转换回你的login路线之前,Ember将实际转换到新的路由(从而加载所有数据等)。 所以这可能会暴露你的应用程序的一部分,你不希望他们再看到。 然而,事实是,所有这些数据仍然被加载到内存中,并通过JavaScript控制台访问,所以我认为这是一个体面的解决scheme。

另外请记住,因为Ember.Route.extend返回一个新的对象,你可以创build自己的包装,然后在整个应用程序中重复使用它:

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

如果你使用上面的解决scheme,那么你可以樱桃挑选你确认哪些路线。 您也可以在“ redirectToLogin ”中select“检查是否正在转换到login屏幕”。

我把一个超级简单的包pipe理会话和authentication称为Ember.Session https://github.com/andrewreedy/ember-session

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

有两个关于authentication的屏幕录像。

谢谢。