Angularjs ui-router. Jak przekierować na stronę logowania

Mam 4 Stany: dashboard, dahboard.główna, deska rozdzielcza.drobne, login . pulpit nawigacyjny jest abstrakcyjny i jest stanem nadrzędnym dla .minor i .główne stany. Poniżej mój kod:

.state('dashboard', {
        url: "/dashboard",
        abstract: true,
        templateUrl: "views/dashboard.html",
        resolve: {
            auth: function ($q, authenticationSvc) {
                var userInfo = authenticationSvc.getUserInfo();
                if (userInfo) {
                    return $q.when(userInfo);
                } else {
                    return $q.reject({ authenticated: false });
                }
            }
        },
        controller: "DashboardCtrl",
        data: { pageTitle: 'Example view' }
    })
    .state('dashboard.main', {
        url: "",
        templateUrl: "views/main.html",
        controller: "DashboardCtrl",
        data: { pageTitle: 'Main view' }
    })

Jak widzisz w dashboard state mam opcję resolve. W ten sposób chciałbym przekierować użytkownika do strony logowania, jeśli nie jest on autoryzowany. Z tego powodu korzystam ze specjalnej usługi uwierzytelniania :

.factory("authenticationSvc", ["$http", "$q", "$window", function ($http, $q, $window) {
    var userInfo;

    function login(email, password) {
        var deferred = $q.defer();

        $http.post("/api/login", { email: email, password: password })
            .then(function (result) {
                if(result.data.error == 0) {
                    userInfo = {
                        accessToken: result.data.accessToken
                    };
                    $window.sessionStorage["userInfo"] = JSON.stringify(userInfo);
                    deferred.resolve(userInfo);
                }
                else {
                    deferred.reject(error);
                }
            }, function (error) {
                deferred.reject(error);
            });

        return deferred.promise;
    }
    function getUserInfo() {
        return userInfo;
    }
    return {
        login: login,
        logout: logout,
        getUserInfo: getUserInfo
    };
}]);

Sprawdzam wartość auth w config :

.run(function($rootScope, $location, $state) {
    $rootScope.$state = $state;
    $rootScope.$on("routeChangeSuccess", function(userInfo) {
        consol.log(userInfo);
    });
    $rootScope.$on("routeChangeError", function(event, current, previous, eventObj) {
        if(eventObj.authenticated === false) {
            $state.go('login');
        }
    });
});

Ale niestety, gdy idę do katalogu głównego lub stanu Pulpitu nawigacyjnego, dostaję pustą stronę. Co jest nie tak z tym kodem? Dzięki!

Author: a14m, 2014-11-30

3 answers

Chodzi o to, aby nie przekierowywać, jeśli nie jest to potrzebne = = = jeśli już Przekierowano do zamierzonego stanu. Istnieje działający plunker z podobnym rozwiązaniem

.run(function($rootScope, $location, $state, authenticationSvc) {


    $rootScope.$on( '$stateChangeStart', function(e, toState  , toParams
                                                   , fromState, fromParams) {

        var isLogin = toState.name === "login";
        if(isLogin){
           return; // no need to redirect 
        }

        // now, redirect only not authenticated

        var userInfo = authenticationSvc.getUserInfo();

        if(userInfo.authenticated === false) {
            e.preventDefault(); // stop current execution
            $state.go('login'); // go to login
        }
    });
});

Sprawdź je dla podobnych wyjaśnień:

 77
Author: Radim Köhler,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:34:28

Ponieważ używasz modułu UI-Router, powinieneś używać $stateChangeStart, $stateChangeSuccess wydarzenia.

Sprawdź ten link, aby uzyskać więcej: https://github.com/angular-ui/ui-router/issues/17

Jest też literówka w consol.log(userInfo) w konsoli.

Sprawdź konsolę w chrome-dev-tools. To da pojęcie, czy czegoś jeszcze brakuje.

 4
Author: Vamshi Suram,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-30 13:30:45

Uważaj, że w rzeczywistości $stateChangeSuccess event jest przestarzały i nie jest już dostępny w angular-ui-route pakiecie. Tym zachowaniem zajmuje się transition hooks. Możesz osiągnąć swój cel za pomocą $transitions.onStart Jak Następuje:

run.$inject = ['$transitions', 'authenticationSvc'];
function run($transitions, authenticationSvc) {

  $transitions.onStart({}, function (trans) {
    var userInfo = authenticationSvc.getUserInfo();

    var $state = trans.router.stateService;

    if(userInfo.authenticated === false) {
        $state.go('login'); // go to login
    }
  });
}
 0
Author: guijob,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-09 01:29:27