我的应用有两页:main.html
和login.html
。
如果未经过身份验证的用户转到/main
,则应将其重定向到/login
。
问题是首先呈现main.html
,大约一秒后,当用户身份验证失败时,呈现login.html
。
如果身份验证成功,我怎么能阻止main.html
呈现?
以下是相关代码(CoffeeScript):
angular.module('myApp', [...])
.config(['$routeProvider', ($routeProvider) ->
$routeProvider.when '/login',
templateUrl: 'html/login.html'
controller: LoginController
$routeProvider.otherwise
templateUrl: 'html/main.html'
controller: MainController
])
.run(['$rootScope', '$location', 'appService', ($rootScope, $location, app) ->
$rootScope.$on '$locationChangeStart', (event, newValue, oldValue) ->
return if newValue == '/login'
$.when(app.authenticate()).fail ->
$location.path '/login'
$rootScope.$apply()
])
angular.module('myApp.services').factory 'appService' , () ->
rootRef = new Firebase('https://myapp.firebaseio.com')
user: null
authenticate: ->
deferred = $.Deferred()
authClient = new FirebaseAuthClient rootRef, (error, user) =>
if error
# An error occurred while attempting login
@user = null
deferred.reject()
else if user
# User authenticated with Firebase
@user = user
deferred.resolve()
else
# User is logged out
@user = null
deferred.reject()
deferred.promise()
答案 0 :(得分:1)
好吧,在用户通过身份验证之前,我不会提供模板(在您的情况下为main.html
)。我在服务器上有一个用于提供模板的自定义功能,用于检查用户是否经过身份验证。如果在函数中我发现用户未登录,则返回带有401状态代码的响应。在角度代码中,我将请求保持到身份验证,然后再次请求模板。
我受到了这篇文章的启发:http://www.espeo.pl/2012/02/26/authentication-in-angularjs-application
答案 1 :(得分:0)
我对同一要求的解决方案是定义以下手表:
$rootScope.$watch(
function() {
return $location.path();
},
function(newValue, oldValue) {
if (newValue != '/login' && user is not logged in) {
$location.path('/login');
}
},
true);
在与索引页面的body元素相关联的控制器中(即包含ng-view
指令的页面)。
答案 2 :(得分:0)
一个选项是隐藏正常的DOM并显示“Authenticating ...”消息,可能带有一个微调器,让用户知道他/她为什么坐在那里等待发生的事情。在main.html中,包含以下内容:
<spinner ng-hide="appService.wrapper.user"></spinner>
<!-- everything else ng-show="appService.wrapper.user" -->
其中<spinner></spinner>
是一个Angular directive,被您的自定义“Authenticating ...”消息取代,user
是您的appService可用于MainController
的变量。请注意,您可能需要将user
包装在appService中的对象中,如下所示:
.service('appService', function() {
var wrapper = {
user: null
};
function authenticate() {
// start the authentication and return the promise,
// but modify wrapper.user instead of user
}
return wrapper;
});
您还需要将appService
或appService.wrapper
存储在$scope
的{{1}}变量中。