我正在尝试在使用 Firebase 简单登录和ember-cli.
- 在允许进入任何路由之前检查用户是否已通过身份验证。所有路由都需要进行身份验证。
- 如果用户未通过身份验证,则重定向到
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 简单登录来保护路由?任何帮助,将不胜感激。