使用我的第一个EmberJS应用程序。整个应用程序要求用户登录。我试图绕过最好的方法来强制用户现在登录(当页面最初加载时)和将来(当用户是退出并且没有刷新)。
我已经处理了用户身份验证挂钩 - 现在我有一个ember-data模型和连接该句柄的相关商店,授权用户并创建用户" session" (使用sessionStorage)。
我不知道该怎么做是强制在跨路径转换时对用户进行身份验证,包括根路由中的初始转换。我把这个逻辑放在哪里?如果我有一个身份验证状态管理器,我该如何将其挂钩到路由?我应该有一条在根路由之外的身份验证路由吗?
注意:如果这个问题措辞不当或我需要更好地解释,请告诉我,我很乐意这样做。
修改 我最终做了一些我认为更尴尬的事情,虽然可能是一个混乱的实现。我有一个auth statemanager,用于存储当前用户的身份验证密钥以及当前状态。
每当需要身份验证时,它只会向authmanager请求它并传递回调函数以使用身份验证密钥运行。如果用户未登录,则会提取登录表单,暂停回调功能,直到用户登录为止。
这里是我使用的代码的一些选择部分。需要清理,我遗漏了一些东西。 http://gist.github.com/3741751
答案 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)