javascriptangularjsroute-providerangularjs-config

Building $routeProvider based on Role


I have a very simple requirement.

I have 3 User Roles:

  1. CATUSER
  2. LICUSER
  3. ALLUSER

    • I have the value of the User Role in the $rootScope.userRole variable.
    • I have the User Role already defined before the AngularJS application starts because AngularJS app is called from a PHP script and User Role is already defined in the PHP script.

Now, when the AngularJS app starts, according to the Role I want to have following Routes:

$rootScope.userRole == "CATUSER"

if ($rootScope.userRole == "CATUSER") {

    $routeProvider
        .when("/catheter", {
            title: "Catheter Expiration Code Generator",
            templateUrl: "app/catheter/catheter.html",
            controller: "CatheterController",
            controllerAs: "vm"
        })
        .when("/support", {
            title: "Support",
            templateUrl: "app/support/support.html",
            controller: "SupportController",
            controllerAs: "vm"
        })
        .otherwise({
            redirectTo: "/catheter"
        });

}

$rootScope.userRole == "LICUSER"

if ($rootScope.userRole == "LICUSER") {

    $routeProvider
        .when("/license", {
            title: "License Generator",
            templateUrl: "app/license/license.html",
            controller: "LicenseController",
            controllerAs: "vm"
        })
        .when("/support", {
            title: "Support",
            templateUrl: "app/support/support.html",
            controller: "SupportController",
            controllerAs: "vm"
        })
        .otherwise({
            redirectTo: "/license"
        });

}

$rootScope.userRole == "ALLUSER"

if ($rootScope.userRole == "LICUSER") {

   $routeProvider
        .when("/license", {
            title: "License Generator",
            templateUrl: "app/license/license.html",
            controller: "LicenseController",
            controllerAs: "vm"
        })
        .when("/catheter", {
            title: "Catheter Expiration Code Generator",
            templateUrl: "app/catheter/catheter.html",
            controller: "CatheterController",
            controllerAs: "vm"
        })
        .when("/support", {
            title: "Support",
            templateUrl: "app/support/support.html",
            controller: "SupportController",
            controllerAs: "vm"
        })
        .otherwise({
            redirectTo: "/license"
        });

}

I don't want to use UI Router.


Solution

  • I use UI Router for this kind of purpose in past. Here is the sample code to get you started

    angular
    .module('app', [
    
    ])
    .config(function ($stateProvider, $urlRouterProvider, $locationProvider) {
        $stateProvider
        .state('license', {
            url: 'url',
            templateUrl: './preview.html',
            controller: 'LicenseController',
            data: {
                requiredAuth: true,
                role: ['CATUSER', 'LICUSER'],
                permission : ['read', 'write', 'etc etc']
            }
        })
        $urlRouterProvider.otherwise(subdomain1 + 'error');
    })
    .run(['$rootScope', '$state', function ($rootScope, $state) {
        $rootScope.$on('$stateChangeStart', function (event, toState, toParams, fromState, fromParams) {
            // is authenticated
            var isAuthenticationRequired = toState.data
                  && toState.data.requiredAuth
                  && !AuthService.isAuthenticated() //some service to check if user is authenticated (I use localstorage lookup here)
            ;
            // is authorized
            var isAuthorizationRequired = toState.data
                  && (toState.data.role && AuthService.IsInRole(toState.data.role))
                  && (toState.data.permission && AuthService.IsInPermission(toState.data.permission))
            ;
            if (isAuthenticationRequired) {
                event.preventDefault();
                $state.go('auth.login');
            }
            else if (isAuthorizationRequired) {
                event.preventDefault();
                $state.go('auth.denied');
            }
        });
        $rootScope.$on('$stateChangeSuccess', function (event, toState, toParams, fromState, fromParams, error) {
            cfpLoadingBar.complete();
        });
        $rootScope.$on('$stateChangeError', function (event, toState, toParams, fromState, fromParams, error) {
            cfpLoadingBar.complete();
        });
    }]);
    

    Here you see License route has property data. Its required authentication and it is authorized for LICUSER and CATUSER roles. You can also add more permission check here for example read, write etc. If user is authenticated and authorized the requested the requested state will load up else will redirect to login or denied request.