angularjs redirect to login page if not authenticated with exceptions

后端 未结 2 675
攒了一身酷
攒了一身酷 2020-12-18 14:34

EDIT: forgot to mention that i\'ve been working with AngularJs for a week only, so if you see something you think should be changed for the better and is not related to the

相关标签:
2条回答
  • 2020-12-18 14:47

    Finally figured out how to solve it using resolve.

    first of all I completely removed the interceptor I was using before. then I made a function inside my Routing .config to use with every resolve for the authentication. finally to handle my resolve I'm using $stateChangeError to redirect to the login state

    the Routing Config

    .config(function ($stateProvider, $urlRouterProvider) {
    
        // function to check the authentication //
        var Auth = ["$q", "authService", function ($q, authService) {
            authService.fillAuthData;
            if (authService.authentication.isAuth) {
                return $q.when(authService.authentication);
            } else {
                return $q.reject({ authenticated: false });
            }
        }];
    
        /* if the state does not exist */
        $urlRouterProvider
            .otherwise('/page-not-found'); 
    
        $stateProvider
    
            // state that allows non authenticated users //
            .state('home', {
                url: '/',
                templateUrl: '/Content/partials/home.html',
            })
    
            // state that needs authentication //
            .state('smo-dashboard', {
                url: '/dashboard',
                templateUrl: '/Content/partials/dashboard.html',
                resolve: {
                    auth: Auth
                }
            })
    
            // errors //
             .state('page-not-found', {
                 url: '/page-not-found',
                 templateUrl: '/Content/partials/error/404.html'
             })
    
            // accounts //
            .state('login', {
                url: '/accounts/login',
                templateUrl: '/Content/partials/account/login.html'
            })
    
            // OTHER STATES //
        }
    );
    

    in the MainController

    $scope.$on("$stateChangeError", function (event, toState, toParams, fromState, fromParams, error) {
        $state.go("login");
    });
    
    0 讨论(0)
  • 2020-12-18 14:56

    An error service like this could help to handle what to do according to status in responses:

    'use strict';

    /**
     * Error Service
     */
    
    angular.module('app.errorService', [])
            .factory("errorService", function ($route, $location) {        
                    return {   
                        checkAndReturnError: function(a,b,c) {
                            if (a.status === 401){
                                (function(){
                                    return $location.path("/accounts/login");
                                }());
                                return;
                            }
                            if (a.status === 404)
                                return;
    
                               alert("Error \n *" + a.data.message);
    
                        }
                    };
            });
    

    Then when you do your calls if the response status is 401 it will redirect. The vbad thing agout this is you have to add it to all calls:

                $scope.pageChanged = function() {
                    $scope.Promise = Resource.get({}, function(response) {
                    }, errorService.checkAndReturnError);
                };
    
    0 讨论(0)
提交回复
热议问题