我试图在使用Firebase、简单登录和ember-cli的Ember应用程序中实现以下事件序列。
LoginRoute。如果用户经过身份验证,允许他们进入路由。为了完成步骤1,我在初始化器中重新打开Ember.Route并实现beforeModel挂钩。
`import LoginController from "tracking/controllers/login"`
AuthInitializer =
name: 'authInitializer'
initialize: (container, application) ->
# Register LoginController with all controllers/routes
application.register 'main:auth', LoginController
application.inject 'route', 'auth', 'main:auth'
application.inject 'controller', 'auth', 'main:auth'
application.inject 'main:auth', 'store', 'store:main'
# Ensure user is logged in before allowing entry
Ember.Route.reopen
beforeModel: (transition) ->
@transitionTo 'login' if !@get('auth.isAuthed')
`export default AuthInitializer`如果用户目前没有登录,上述代码确实会重定向到login。
LoginController只需实例化一个新的FirebaseSimpleLogin对象并注册适当的回调函数。
LoginController = Ember.ObjectController.extend
# Some of the controller is omitted for brevity...
auth: null
isAuthed: false
init: ->
dbRef = new Firebase('https://dawnbreaker.firebaseio.com')
@set('auth', new FirebaseSimpleLogin(dbRef, @authCompleted.bind(@)))
@_super()
authCompleted: (error, user) ->
if error
# Handle invalid login attempt..
else if user
# Handle successful login..
unless @get('isAuthed')
@set('currentUserId', user.id)
@set('isAuthed', true)
@transitionToRoute('index')
else
# Handle logout..
@set('currentUserId', null)
@set('isAuthed', false)
`export default LoginController`我的实施有两个问题。
LoginController第一次初始化时,isAuthed设置为false。因此,当authCompleted完成时,应用程序将始终重定向到index。beforeModel钩子在authCompleted回调完成之前执行,导致钩子重定向到login。页面刷新的结果是
login模板会闪烁一秒钟。index。这将导致每一次页面刷新都丢失其当前位置(重定向到index路由)。
问题是,如何使用Ember和Firebase简单登录保护路由?任何帮助都将不胜感激。
发布于 2014-06-15 23:54:35
完全是我的观点,但我喜欢把资源树的第四部分。它不需要是url的一部分,但可以是。使用这种方式,它仍然可以使用全局控制器(它将根据从调用返回的内容来连接,如果您在登录中获取它,则还可以使用其他连接)。
App.Router.map(function() {
this.resource('auth', {path:''}, function(){
this.resource('foo');
this.resource('bar', function(){
this.route('baz')
});
});
this.route('login');
});
App.AuthRoute = Em.Route.extend({
model: function(params, transition){
var self = this;
// you can skip calling back with a local property
return $.getJSON('/auth').then(function(result){
if(!result.good){
self.transitionTo('login');
}
return result;
});
}
}); http://emberjs.jsbin.com/OxIDiVU/668/edit
在不承诺回调的情况下,您可以创建自己的承诺,并在适当的时候解决这个问题。
model: function(){
var defer = Ember.RSVP.defer(),
firebase = new Firebase('https://dawnbreaker.firebaseio.com'),
fbLogin = new FirebaseSimpleLogin(firebase, this.authCompleted.bind(this));
this.setProperties({
defer: defer,
firebase: firebase,
fbLogin: fbLogin
});
return defer.promise.then(function(result){
// maybe redirect if authed etc...
});
},
authCompleted: function(error, user){
var defer = this.get('defer');
//if authenticated
defer.resolve({auth:true});
//else authenticated
defer.resolve({auth:false});
}https://stackoverflow.com/questions/24234810
复制相似问题