如何在Angularjs中登录/注销后限制页面重定向?

时间:2016-09-14 06:27:03

标签: angularjs

我需要限制用户进行重定向,只需要通过身份验证登录。

我试过但我可以使用后退按钮重定向到登录页面,然后使用前进按钮再次访问同一页面。即使我可以在没有登录的情况下使用URL转到所需的页面。

我的代码:

config.$inject = ['$routeProvider', '$locationProvider'];
    function config($routeProvider, $locationProvider ) {

        $routeProvider

            .when('/login', {
                controller: 'LoginController',
                templateUrl: 'view/login.view.html',
                controllerAs: 'vm'
            })

            .when('/profileData', {
                controller: 'profileDataController',
                templateUrl: 'view/profiledata.view.html',
                controllerAs :'vm'
            })

            .when('/questionBank', {
                controller: 'questionbankController',
                templateUrl: 'view/questionbank.view.html',
                controllerAs: 'vm'
            })

            .when('/dashboard', {
              //  controller: 'PersonalInfoController',
                templateUrl: 'view/dashboard.view.html',
                controllerAs:'vm'
            })

            .otherwise({ redirectTo: '/login' });

    }

    run.$inject = ['$rootScope', '$location', '$cookieStore', '$http'];
    function run($rootScope, $location, $cookieStore, $http) {
        // keep user logged in after page refresh
        $rootScope.globals  = $cookieStore.get('globals') || {};


        if ($rootScope.globals.currentUser) {
            $http.defaults.headers.common['Authorization'] = 'Basic ' + $rootScope.globals.currentUser.authdata; // jshint ignore:line
        }

         $rootScope.$on('$locationChangeStart', function (event, next, current) {
            //redirect to login page if not logged in and trying to access a restricted page

             var restrictedPage = $.inArray($location.path(), ['/dashboard','/questionBank', '/profileData']) === -1;

/*            var a    = $location.$$absUrl.split('#')[1];
              var patt = new RegExp(a);
              var res  = patt.test(restrictedPage); */

              var loggedIn = $rootScope.globals.currentUser;

            if (restrictedPage && !loggedIn) {
                $location.path('/login');

            }  
        }); 
}

4 个答案:

答案 0 :(得分:1)

使用此:基于服务器的响应

.when('/login', {
                     controller: 'LoginController',
                     templateUrl: 'view/login.view.html',
                    resolve:{
            logincheck: checklogedin
        })


    / resolve function for user....
    var checklogedin = function($q ,$http,$location)
    {   

        var deferred =$q.defer();

        $http.get('/loggedin').success(function(user){

            if (user.staus==true)
            {
                //goo
                deferred.resolve();
            }
           else 
           {
               deferred.reject();
               $location.url('/login');
           }

        });
        return deferred.promise
    };  

答案 1 :(得分:0)

根据您提供的代码,我无法告诉100%您的代码中发生了什么。但是......你总是可以尝试在每个路由上使用resolve属性,而不希望在没有身份验证的情况下允许访问。以下是questionBank的内容:

.when('/questionBank', {
    controller: 'questionbankController',
    templateUrl: 'view/questionbank.view.html',
    controllerAs: 'vm',
    resolve: {
        auth: function(AuthService, $q){
            if(AuthService.isAuthenticated()) return $q.resolve();
            return $q.reject();
        }
    }
})

resolve对象的每个属性都应返回一个promise,如果解析了......路由更改有效。如果拒绝......则不允许更改路线。如果承诺永远不会解决,那么你就会被搞砸,所以要确保它已经解决,否则它将永远无法解决。

这不是尝试你所说的唯一方法。这是尝试它的一种方式。

答案 2 :(得分:0)

You can also add event listener on your $scope and prevent moving in case of unauthenticated user.

$scope.$on('$locationChangeStart', function (event, next, current) {
    if (!is_logged_in) {
        event.preventDefault();
    }
});

答案 3 :(得分:0)

在我的代码中,我有两个主控制器LoginCtrlAppCtrl,所有其他控制器都嵌套在AppCtrl中。然后在AppCtrl我有这个代码,它将检查登录用户。

if (localStorageService.get('authToken') === null) { $state.go('login', {locale: CONFIG.defaultLang}); } else if (!userService.isLoggedIn()) { tokenStorage.setAuthToken(localStorageService.get('authToken')); userService.setIdentity(JSON.parse(localStorageService.get('user'))); }

如您所见,我将服务器中的身份验证令牌存储在本地存储中。页面loades时,将执行此代码,如果您未登录,则将重定向。并且因为所有其他应用程序控制器都嵌套在AppCtrl中,所以每次都会执行此代码。

有关嵌套控制器的更多信息,请尝试本文 - https://rclayton.silvrback.com/parent-child-controller-communication