我希望能够在我的网站上全局使用登录的对象。我想知道,如何将对象移动到服务并利用它来检查loggedin。这是我的登录控制器:
.controller('LoginCtrl', function ($scope, $location, userAuth) {
$scope.login = function() {
$scope.authData = null;
$scope.error = null;
userAuth.$signInWithEmailAndPassword($scope.loginemail, $scope.loginpassword)
.then(function(authData) {
$scope.authData = authData;
console.log(authData);
}).catch(function(error) {
$scope.error = error.message;
});
};
我的服务是:
.service('userAuth', ["$firebaseAuth", function($firebaseAuth) {
return $firebaseAuth();
}
我能够成功登录,但我希望能够在全球范围内使用登录凭据。通过这样做,我还应该如何防止某些路由,除非用户经过身份验证。
如果路由仅适用于loggedin用户,请将他们重定向到loggepin页面。如果他们已经登录并试图访问注册页面,请将他们注销。如果他们登录并试图访问登录页面,请将他们重定向到配置文件页面。
我建议将用户数据存储在服务本身中,而不是将其返回给调用者。例如:
.service('userAuth', ["$firebaseAuth", function($firebaseAuth) {
var userData;
this.login = function(loginEmail, loginPassword){
return $firebaseAuth
.$signInWithEmailAndPassword(loginEmail, loginPassword)
.then(function(authData) {
userData = authData;
});
}
this.getUserData = function(){
return userData;
}
}
并将其用于控制器:
.controller('LoginCtrl', function ($scope, $location, userAuth) {
$scope.login = function() {
$scope.authData = null;
$scope.error = null;
userAuth.login($scope.loginemail, $scope.loginpassword)
.then(function() {
$scope.authData = userAuth.getUserData();
console.log($scope.authData);
}).catch(function(error) {
$scope.error = error.message;
});
};
使用这种方法,您可以获得几个好处:
封装登录逻辑。通过这种方式,您可以轻松更改登录服务,而不会中断应用程序的任何其他部分。
通过注入auth服务并调用getUserData函数,您可以访问应用程序任何部分的用户数据。
为了防止用户访问特定路线,您可以使用$routeChangeStart
事件捕获路线更改以停止导航,然后根据业务逻辑重定向到其他路线。