在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.Route
的enter
和exit
方法中添加挂钩:
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的屏幕录像。
谢谢。
- 何时通过Facebook的新Android SDK 3.0请求权限?
- Gmail启用双因素身份validation时,发送电子邮件失败
- “git push heroku master”仍然要求authentication
- configurationSpring Security 3.x有多个入口点
- Angularfire 2错误:指定的身份validation提供程序未启用此Firebase
- Symfony2扩展DefaultAuthenticationSuccessHandler
- 将密钥对添加到现有的EC2实例
- 如何以编程方式login/authentication用户?
- 使用passport.js在node.js中进行身份validation后,redirect到上一页