我的解决方案分为三个部分:用户状态存储在服务中;在运行方法中,您观察路由更改时的运行方式;检查是否允许用户访问请求的页面;在主控制器中,查看是否用户状态更改。
app.run(['$rootScope', '$location', 'Auth', function ($rootScope, $location, Auth) { $rootScope.$on('$routeChangeStart', function (event) { if (!Auth.isLoggedIn()) { console.log('DENY'); event.preventDefault(); $location.path('/login'); } else { console.log('ALLOW'); $location.path('/home'); } });}]);您应该创建一个服务(我将其命名为
Auth),该服务将处理用户对象并具有一种方法来确定用户是否已登录。
服务内容 :
.factory('Auth', function(){var user;return{ setUser : function(aUser){ user = aUser; }, isLoggedIn : function(){ return(user)? user : false; } }})app.run您应该从中收听
$routeChangeStart事件。当路由更改时,它将检查用户是否已登录(该
isLoggedIn方法应进行处理)。如果用户未登录,它将不会加载请求的路由,并将用户重定向到正确的页面(在您的情况下为登录)。
本
loginController应该在你的登录页面被用来处理登录。它应该与
Auth服务进行交互,并设置用户是否已登录。
loginController :
.controller('loginCtrl', [ '$scope', 'Auth', function ($scope, Auth) { //submit $scope.login = function () { // Ask to the server, do your job and THEN set the user Auth.setUser(user); //Update the state of the user in the app };}])从主控制器,您可以侦听用户状态是否发生更改并做出重定向。
.controller('mainCtrl', ['$scope', 'Auth', '$location', function ($scope, Auth, $location) { $scope.$watch(Auth.isLoggedIn, function (value, oldValue) { if(!value && oldValue) { console.log("Disconnect"); $location.path('/login'); } if(value) { console.log("Connect"); //Do something when the user is connected } }, true);


