AngularJS - Connexion et authentification dans chaque route et contrôleur

130

J'ai une application AngularJS créée en utilisant yeoman, grunt et bower.

J'ai une page de connexion qui a un contrôleur qui vérifie l'authentification. Si les informations d'identification sont correctes, je redirige vers la page d'accueil.

app.js

'use strict';
//Define Routing for app
angular.module('myApp', []).config(['$routeProvider', '$locationProvider',
  function($routeProvider,$locationProvider) {
    $routeProvider
    .when('/login', {
        templateUrl: 'login.html',
        controller: 'LoginController'
    })
    .when('/register', {
        templateUrl: 'register.html',
        controller: 'RegisterController'
      })
    .when('/forgotPassword', {
        templateUrl: 'forgotpassword.html',
        controller: 'forgotController'
      })
   .when('/home', {
       templateUrl: 'views/home.html',
       controller: 'homeController'
    })
    .otherwise({
       redirectTo: '/login'
    });
//    $locationProvider.html5Mode(true); //Remove the '#' from URL.
}]);

angular.module('myApp').factory("page", function($rootScope){
    var page={};
    var user={};
    page.setPage=function(title,bodyClass){
        $rootScope.pageTitle = title;
        $rootScope.bodylayout=bodyClass;
    };
    page.setUser=function(user){
        $rootScope.user=user;
    }
    return page;
});

LoginControler.js

'use strict';

angular.module('myApp').controller('LoginController', function($scope, $location, $window,page) {
    page.setPage("Login","login-layout");
    $scope.user = {};
    $scope.loginUser=function()
    {
        var username=$scope.user.name;
        var password=$scope.user.password;
        if(username=="admin" && password=="admin123")
        {
            page.setUser($scope.user);
            $location.path( "/home" );
        }
        else
        {
            $scope.message="Error";
            $scope.messagecolor="alert alert-danger";
        }
    }
});

Sur la page d'accueil, j'ai

<span class="user-info">
    <small>Welcome,</small>
    {{user.name}}
</span>
<span class="logout"><a href="" ng-click="logoutUser()">Logout</a></span>

Dans le loginController, je vérifie les informations de connexion et si cela réussit, je définis l'objet utilisateur dans l'usine de service. Je ne sais pas si c'est exact ou non.

Ce dont j'ai besoin, c'est que lorsque l'utilisateur est connecté, il définit une valeur dans l'objet utilisateur afin que toutes les autres pages puissent obtenir cette valeur.

Chaque fois qu'un changement d'itinéraire se produit, le contrôleur doit vérifier si l'utilisateur est connecté ou non. Sinon, il devrait rediriger vers la page de connexion. De plus, si l'utilisateur est déjà connecté et revient à la page, il doit aller à la page d'accueil. Le contrôleur doit également vérifier les informations d'identification sur toutes les routes.

J'ai entendu parler des ng-cookies, mais je ne sais pas comment les utiliser.

La plupart des exemples que j'ai vus n'étaient pas très clairs et ils utilisent une sorte de rôles d'accès ou quelque chose. Je ne veux pas de ça. Je veux seulement un filtre de connexion. Quelqu'un peut-il me donner des idées?

iCode
la source

Réponses:

180

Ma solution se décompose en 3 parties: l'état de l'utilisateur est stocké dans un service, dans la méthode run vous regardez quand l'itinéraire change et vous vérifiez si l'utilisateur est autorisé à accéder à la page demandée, dans votre contrôleur principal vous regardez si l'état du changement d'utilisateur.

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');
        }
    });
}]);

Vous devez créer un service (je vais le nommer Auth) qui gérera l'objet utilisateur et aura une méthode pour savoir si l'utilisateur est connecté ou non.

service :

 .factory('Auth', function(){
var user;

return{
    setUser : function(aUser){
        user = aUser;
    },
    isLoggedIn : function(){
        return(user)? user : false;
    }
  }
})

De votre app.run, vous devriez écouter l' $routeChangeStartévénement. Lorsque l'itinéraire changera, il vérifiera si l'utilisateur est connecté (la isLoggedInméthode doit le gérer). Il ne chargera pas l'itinéraire demandé si l'utilisateur n'est pas connecté et il redirigera l'utilisateur vers la bonne page (dans votre cas de connexion).

Le loginControllerdoit être utilisé dans votre page de connexion pour gérer la connexion. Il devrait simplement interagir avec le Authservice et définir l'utilisateur comme connecté ou non.

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
  };
}])

Depuis votre contrôleur principal, vous pouvez écouter si l'état de l'utilisateur change et réagir avec une redirection.

.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);
bavarder
la source
1
Le loginController permettra à l'utilisateur de se connecter à partir de la page de connexion. Il gérera le formulaire de connexion. Le formulaire doit appeler une méthode d'envoi qui fait partie de votre loginController. Cette méthode mettra à jour (si le formulaire est correct et que l'utilisateur doit être connecté) l'état de l'utilisateur UTILISANT le service d'authentification que j'ai décrit.
gab du
2
A travaillé comme un charme! Au lieu du service fourni, j'ai utilisé Auth0 avec AngularJS .
Nikos Baxevanis
34
Que faire si l'utilisateur frappe F5 et actualise? Ensuite, votre Auth en mémoire est parti.
Gaui
4
Juste au cas où d'autres auraient des problèmes pour exécuter cet exemple: dans le routeChangeStartrappel, vous devriez vérifier si l'emplacement est réellement "/ login" et autoriser que:if ( $location.path() === "/login" ) return;
user2084865
1
ça me met en boucle infinie.
Nipun Tyagi
110

Voici une autre solution possible, utilisant l' resolveattribut du $stateProviderou du $routeProvider. Exemple avec $stateProvider:

.config(["$stateProvider", function ($stateProvider) {

  $stateProvider

  .state("forbidden", {
    /* ... */
  })

  .state("signIn", {
    /* ... */
    resolve: {
      access: ["Access", function (Access) { return Access.isAnonymous(); }],
    }
  })

  .state("home", {
    /* ... */
    resolve: {
      access: ["Access", function (Access) { return Access.isAuthenticated(); }],
    }
  })

  .state("admin", {
    /* ... */
    resolve: {
      access: ["Access", function (Access) { return Access.hasRole("ROLE_ADMIN"); }],
    }
  });

}])

Access résout ou rejette une promesse en fonction des droits de l'utilisateur actuels:

.factory("Access", ["$q", "UserProfile", function ($q, UserProfile) {

  var Access = {

    OK: 200,

    // "we don't know who you are, so we can't say if you're authorized to access
    // this resource or not yet, please sign in first"
    UNAUTHORIZED: 401,

    // "we know who you are, and your profile does not allow you to access this resource"
    FORBIDDEN: 403,

    hasRole: function (role) {
      return UserProfile.then(function (userProfile) {
        if (userProfile.$hasRole(role)) {
          return Access.OK;
        } else if (userProfile.$isAnonymous()) {
          return $q.reject(Access.UNAUTHORIZED);
        } else {
          return $q.reject(Access.FORBIDDEN);
        }
      });
    },

    hasAnyRole: function (roles) {
      return UserProfile.then(function (userProfile) {
        if (userProfile.$hasAnyRole(roles)) {
          return Access.OK;
        } else if (userProfile.$isAnonymous()) {
          return $q.reject(Access.UNAUTHORIZED);
        } else {
          return $q.reject(Access.FORBIDDEN);
        }
      });
    },

    isAnonymous: function () {
      return UserProfile.then(function (userProfile) {
        if (userProfile.$isAnonymous()) {
          return Access.OK;
        } else {
          return $q.reject(Access.FORBIDDEN);
        }
      });
    },

    isAuthenticated: function () {
      return UserProfile.then(function (userProfile) {
        if (userProfile.$isAuthenticated()) {
          return Access.OK;
        } else {
          return $q.reject(Access.UNAUTHORIZED);
        }
      });
    }

  };

  return Access;

}])

UserProfilecopie les propriétés de l' utilisateur en cours, et mettre en œuvre le $hasRole, $hasAnyRole, $isAnonymouset la $isAuthenticatedlogique des procédés (plus un $refreshprocédé, décrites plus loin):

.factory("UserProfile", ["Auth", function (Auth) {

  var userProfile = {};

  var clearUserProfile = function () {
    for (var prop in userProfile) {
      if (userProfile.hasOwnProperty(prop)) {
        delete userProfile[prop];
      }
    }
  };

  var fetchUserProfile = function () {
    return Auth.getProfile().then(function (response) {
      clearUserProfile();
      return angular.extend(userProfile, response.data, {

        $refresh: fetchUserProfile,

        $hasRole: function (role) {
          return userProfile.roles.indexOf(role) >= 0;
        },

        $hasAnyRole: function (roles) {
          return !!userProfile.roles.filter(function (role) {
            return roles.indexOf(role) >= 0;
          }).length;
        },

        $isAnonymous: function () {
          return userProfile.anonymous;
        },

        $isAuthenticated: function () {
          return !userProfile.anonymous;
        }

      });
    });
  };

  return fetchUserProfile();

}])

Auth se charge de demander au serveur, de connaître le profil de l'utilisateur (lié à un jeton d'accès attaché à la requête par exemple):

.service("Auth", ["$http", function ($http) {

  this.getProfile = function () {
    return $http.get("api/auth");
  };

}])

Le serveur doit renvoyer un tel objet JSON lors de la demande GET api/auth:

{
  "name": "John Doe", // plus any other user information
  "roles": ["ROLE_ADMIN", "ROLE_USER"], // or any other role (or no role at all, i.e. an empty array)
  "anonymous": false // or true
}

Enfin, lorsque Accessrejette une promesse, en cas d'utilisation ui.router, l' $stateChangeErrorévénement sera déclenché:

.run(["$rootScope", "Access", "$state", "$log", function ($rootScope, Access, $state, $log) {

  $rootScope.$on("$stateChangeError", function (event, toState, toParams, fromState, fromParams, error) {
    switch (error) {

    case Access.UNAUTHORIZED:
      $state.go("signIn");
      break;

    case Access.FORBIDDEN:
      $state.go("forbidden");
      break;

    default:
      $log.warn("$stateChangeError event catched");
      break;

    }
  });

}])

Si vous utilisez ngRoute, l' $routeChangeErrorévénement sera déclenché:

.run(["$rootScope", "Access", "$location", "$log", function ($rootScope, Access, $location, $log) {

  $rootScope.$on("$routeChangeError", function (event, current, previous, rejection) {
    switch (rejection) {

    case Access.UNAUTHORIZED:
      $location.path("/signin");
      break;

    case Access.FORBIDDEN:
      $location.path("/forbidden");
      break;

    default:
      $log.warn("$stateChangeError event catched");
      break;

    }
  });

}])

Le profil utilisateur est également accessible dans les contrôleurs:

.state("home", {
  /* ... */
  controller: "HomeController",
  resolve: {
    userProfile: "UserProfile"
  }
})

UserProfilecontient alors les propriétés renvoyées par le serveur lors de la demande GET api/auth:

.controller("HomeController", ["$scope", "userProfile", function ($scope, userProfile) {

  $scope.title = "Hello " + userProfile.name; // "Hello John Doe" in the example

}])

UserProfiledoit être actualisé lorsqu'un utilisateur se connecte ou se déconnecte, afin de Accesspouvoir gérer les itinéraires avec le nouveau profil utilisateur. Vous pouvez soit recharger la page entière, soit appeler UserProfile.$refresh(). Exemple lors de la connexion:

.service("Auth", ["$http", function ($http) {

  /* ... */

  this.signIn = function (credentials) {
    return $http.post("api/auth", credentials).then(function (response) {
      // authentication succeeded, store the response access token somewhere (if any)
    });
  };

}])
.state("signIn", {
  /* ... */
  controller: "SignInController",
  resolve: {
    /* ... */
    userProfile: "UserProfile"
  }
})
.controller("SignInController", ["$scope", "$state", "Auth", "userProfile", function ($scope, $state, Auth, userProfile) {

  $scope.signIn = function () {
    Auth.signIn($scope.credentials).then(function () {
      // user successfully authenticated, refresh UserProfile
      return userProfile.$refresh();
    }).then(function () {
      // UserProfile is refreshed, redirect user somewhere
      $state.go("home");
    });
  };

}])
sp00m
la source
3
Je pense que c'est la réponse la plus simple et la plus extensible
Jotham
2
@LeblancMeneses Merci :) Juste pour clarifier les choses: NON AUTORISÉ signifie "nous ne savons pas qui vous êtes, nous ne pouvons donc pas dire si vous êtes autorisé à accéder à cette ressource ou pas encore, veuillez d'abord vous connecter" , pendant INTERDIT signifie "nous savons qui vous êtes et votre profil ne vous permet pas d'accéder à cette ressource" .
sp00m
1
Belle solution, ajustement potentiel avec l'authentification Spring côté serveur
Jan Peter
1
La meilleure solution jamais conçue!
Renan Franca
1
@jsbisht Tout dépend de l'endroit où vous stockez le (s) jeton (s) d'accès (voir le dernier extrait). Si vous ne le stockez que dans la mémoire JS, alors oui: F5 supprimera les informations d'authentification. Mais si vous le stockez dans un stockage persistant (par exemple cookie / localStorage / sessionStorage), alors non: F5 ne supprimera pas les informations d'authentification (tant que vous attachez le jeton à toutes les requêtes $ http, ou au moins aux requêtes envoyées à rest / users / profile, car le serveur est censé renvoyer le profil de l'utilisateur lié au jeton attaché). Méfiez-vous de CSRF lorsque vous utilisez le stockage de cookies.
sp00m
21

La manière la plus simple de définir un comportement personnalisé pour des itinéraires individuels serait assez simple:

1) routes.js: créez une nouvelle propriété (comme requireAuth) pour n'importe quel itinéraire souhaité

angular.module('yourApp').config(function($routeProvider) {
    $routeProvider
        .when('/home', {
            templateUrl: 'templates/home.html',
            requireAuth: true // our custom property
        })
        .when('/login', {
            templateUrl: 'templates/login.html',
        })
        .otherwise({
            redirectTo: '/home'
        });
})

2) Dans un contrôleur de niveau supérieur qui n'est pas lié à un élément à l'intérieur du ng-view(pour éviter tout conflit avec angular $routeProvider), vérifiez si le newUrlpossède la requireAuthpropriété et agissez en conséquence

 angular.module('YourApp').controller('YourController', function ($scope, $location, session) {

     // intercept the route change event
     $scope.$on('$routeChangeStart', function (angularEvent, newUrl) {

         // check if the custom property exist
         if (newUrl.requireAuth && !session.user) {

             // user isn’t authenticated
             $location.path("/login");
         }
     });
 });
DotBot
la source
1
Pouvons-nous spécifier l'attribut 'requireAuth: true' à toutes les routes en un seul endroit ?. Parce que dans mon scénario, ce n'est pas une page de connexion, mais il est authentifié par un appel de repos tiers. Je voulais donc spécifier en un seul endroit, et cela devrait également s'appliquer aux futurs itinéraires ajoutés.
Raghuveer
1
Pas que je sache de. Vous pouvez peut-être vérifier chaque route pour laquelle aucune propriété spéciale n'a été définie routes.js.
DotBot
1
Excellent et simple exemple.Il a été très utile pour mes besoins.
error505 du
6

J'ai écrit un article il y a quelques mois sur la façon de configurer l'enregistrement des utilisateurs et la fonctionnalité de connexion avec Angular, vous pouvez le consulter à http://jasonwatmore.com/post/2015/03/10/AngularJS-User-Registration-and -Login-Example.aspx

Je vérifie si l'utilisateur est connecté à l' $locationChangeStartévénement, voici mon app.js principal montrant ceci:

(function () {
    'use strict';
 
    angular
        .module('app', ['ngRoute', 'ngCookies'])
        .config(config)
        .run(run);
 
    config.$inject = ['$routeProvider', '$locationProvider'];
    function config($routeProvider, $locationProvider) {
        $routeProvider
            .when('/', {
                controller: 'HomeController',
                templateUrl: 'home/home.view.html',
                controllerAs: 'vm'
            })
 
            .when('/login', {
                controller: 'LoginController',
                templateUrl: 'login/login.view.html',
                controllerAs: 'vm'
            })
 
            .when('/register', {
                controller: 'RegisterController',
                templateUrl: 'register/register.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(), ['/login', '/register']) === -1;
            var loggedIn = $rootScope.globals.currentUser;
            if (restrictedPage && !loggedIn) {
                $location.path('/login');
            }
        });
    }
 
})();
Jason
la source
Belle rédaction. Je l'ai utilisé pour référence. Merci @Jason.
Venkat Kotra
2

J'ai l'impression que cette façon est la plus simple, mais c'est peut-être juste une préférence personnelle.

Lorsque vous spécifiez votre route de connexion (et toute autre route anonyme; ex: / register, / logout, / refreshToken, etc.), ajoutez:

allowAnonymous: true

Donc, quelque chose comme ça:

$stateProvider.state('login', {
    url: '/login',
    allowAnonymous: true, //if you move this, don't forget to update
                          //variable path in the force-page check.
    views: {
        root: {
            templateUrl: "app/auth/login/login.html",
            controller: 'LoginCtrl'
        }
    }
    //Any other config
}

Vous n'avez jamais besoin de spécifier "allowAnonymous: false", s'il n'est pas présent, il est supposé faux, dans la vérification. Dans une application où la plupart des URL sont authentifiées de force, cela représente moins de travail. Et plus sûr; si vous oubliez de l'ajouter à une nouvelle URL, le pire qui puisse arriver est qu'une URL anonyme est protégée. Si vous le faites dans l'autre sens, en spécifiant "requireAuthentication: true", et que vous oubliez de l'ajouter à une URL, vous divulguez une page sensible au public.

Ensuite, exécutez-le là où vous vous sentez le mieux adapté à la conception de votre code.

//I put it right after the main app module config. I.e. This thing:
angular.module('app', [ /* your dependencies*/ ])
       .config(function (/* you injections */) { /* your config */ })

//Make sure there's no ';' ending the previous line. We're chaining. (or just use a variable)
//
//Then force the logon page
.run(function ($rootScope, $state, $location, User /* My custom session obj */) {
    $rootScope.$on('$stateChangeStart', function(event, newState) {
        if (!User.authenticated && newState.allowAnonymous != true) {
            //Don't use: $state.go('login');
            //Apparently you can't set the $state while in a $state event.
            //It doesn't work properly. So we use the other way.
            $location.path("/login");
        }
    });
});
Yurelle
la source
1

app.js

'use strict';
// Declare app level module which depends on filters, and services
var app= angular.module('myApp', ['ngRoute','angularUtils.directives.dirPagination','ngLoadingSpinner']);
app.config(['$routeProvider', function($routeProvider) {
  $routeProvider.when('/login', {templateUrl: 'partials/login.html', controller: 'loginCtrl'});
  $routeProvider.when('/home', {templateUrl: 'partials/home.html', controller: 'homeCtrl'});
  $routeProvider.when('/salesnew', {templateUrl: 'partials/salesnew.html', controller: 'salesnewCtrl'});
  $routeProvider.when('/salesview', {templateUrl: 'partials/salesview.html', controller: 'salesviewCtrl'});
  $routeProvider.when('/users', {templateUrl: 'partials/users.html', controller: 'usersCtrl'});
    $routeProvider.when('/forgot', {templateUrl: 'partials/forgot.html', controller: 'forgotCtrl'});


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


}]);


app.run(function($rootScope, $location, loginService){
    var routespermission=['/home'];  //route that require login
    var salesnew=['/salesnew'];
    var salesview=['/salesview'];
    var users=['/users'];
    $rootScope.$on('$routeChangeStart', function(){
        if( routespermission.indexOf($location.path()) !=-1
        || salesview.indexOf($location.path()) !=-1
        || salesnew.indexOf($location.path()) !=-1
        || users.indexOf($location.path()) !=-1)
        {
            var connected=loginService.islogged();
            connected.then(function(msg){
                if(!msg.data)
                {
                    $location.path('/login');
                }

            });
        }
    });
});

loginServices.js

'use strict';
app.factory('loginService',function($http, $location, sessionService){
    return{
        login:function(data,scope){
            var $promise=$http.post('data/user.php',data); //send data to user.php
            $promise.then(function(msg){
                var uid=msg.data;
                if(uid){
                    scope.msgtxt='Correct information';
                    sessionService.set('uid',uid);
                    $location.path('/home');
                }          
                else  {
                    scope.msgtxt='incorrect information';
                    $location.path('/login');
                }                  
            });
        },
        logout:function(){
            sessionService.destroy('uid');
            $location.path('/login');
        },
        islogged:function(){
            var $checkSessionServer=$http.post('data/check_session.php');
            return $checkSessionServer;
            /*
            if(sessionService.get('user')) return true;
            else return false;
            */
        }
    }

});

sessionServices.js

'use strict';

app.factory('sessionService', ['$http', function($http){
    return{
        set:function(key,value){
            return sessionStorage.setItem(key,value);
        },
        get:function(key){
            return sessionStorage.getItem(key);
        },
        destroy:function(key){
            $http.post('data/destroy_session.php');
            return sessionStorage.removeItem(key);
        }
    };
}])

loginCtrl.js

'use strict';

app.controller('loginCtrl', ['$scope','loginService', function ($scope,loginService) {
    $scope.msgtxt='';
    $scope.login=function(data){
        loginService.login(data,$scope); //call login service
    };

}]);
Jaydeep Gondaliya
la source
1

Vous pouvez utiliser resolve:

angular.module('app',[])
.config(function($routeProvider)
{
    $routeProvider
    .when('/', {
        templateUrl  : 'app/views/login.html',
        controller   : 'YourController',
        controllerAs : 'Your',
        resolve: {
            factory : checkLoginRedirect
        }
    })
}

Et, la fonction de la résolution:

function checkLoginRedirect($location){

    var user = firebase.auth().currentUser;

    if (user) {
        // User is signed in.
        if ($location.path() == "/"){
            $location.path('dash'); 
        }

        return true;
    }else{
        // No user is signed in.
        $location.path('/');
        return false;
    }   
}

Firebase a également une méthode qui vous aide à installer un observateur, je vous conseille de l'installer dans un .run:

.run(function(){

    firebase.auth().onAuthStateChanged(function(user) {
        if (user) {
            console.log('User is signed in.');
        } else {
            console.log('No user is signed in.');
        }
    });
  }
Diogo Machado
la source
0

Par exemple, une application a deux utilisateurs appelés ap et auc. Je passe une propriété supplémentaire à chaque route et gère le routage en fonction des données que j'obtiens dans $ routeChangeStart.

Essaye ça:

angular.module("app").config(['$routeProvider',
function ($routeProvider) {

    $routeProvider.
            when('/ap', {
                templateUrl: 'template1.html',
                controller: 'template1',
                isAp: 'ap',
            }).
            when('/auc', {
                templateUrl: 'template2.html',
                controller: 'template2',
                isAp: 'common',
            }).
            when('/ic', {
                templateUrl: 'template3.html',
                controller: 'template3',
                isAp: 'auc',
            }).
            when('/mup', {
                templateUrl: 'template4.html',
                controller: 'template4',
                isAp: 'ap',
            }).

            when('/mnu', {
                templateUrl: 'template5.html',
                controller: 'template5',
                isAp: 'common',
            }).                               
            otherwise({
                redirectTo: '/ap',
            });
   }]);

app.js:

.run(['$rootScope', '$location', function ($rootScope, $location) {                
    $rootScope.$on("$routeChangeStart", function (event, next, current) {
        if (next.$$route.isAp != 'common') {
            if ($rootScope.userTypeGlobal == 1) {
                if (next.$$route.isAp != 'ap') {
                    $location.path("/ap");
                }
            }
            else {
                if (next.$$route.isAp != 'auc') {
                    $location.path("/auc");
                }                        
            }
        }

    });
}]);
suresh
la source
0

Tous ont suggéré une grande solution pour laquelle vous vous inquiétez de la session côté client. Je veux dire quand l'état / l'url change, je suppose que vous faites un appel ajax pour charger les données pour tempelate.

Note :- To Save user's data you may use `resolve` feature of `ui-router`.
 Check cookie if it exist load template , if even cookies doesn't exist than 
there is no chance of logged in , simply redirect to login template/page.

Maintenant, les données ajax sont renvoyées par le serveur en utilisant n'importe quelle API. Maintenant, le point est entré en jeu, renvoyez les types de retour standard en utilisant le serveur en fonction du statut connecté de l'utilisateur. Vérifiez ces codes de retour et traitez votre demande dans le contrôleur. Remarque: - Pour le contrôleur qui ne nécessite pas d'appel ajax nativement, vous pouvez appeler une requête vide au serveur comme ceci server.location/api/checkSession.phpet ceci est checkSession.php

<?php/ANY_LANGUAGE
session_start();//You may use your language specific function if required
if(isset($_SESSION["logged_in"])){
set_header("200 OK");//this is not right syntax , it is just to hint
}
else{
set_header("-1 NOT LOGGED_IN");//you may set any code but compare that same       
//code on client side to check if user is logged in or not.
}
//thanks.....

Du côté client à l'intérieur du contrôleur ou via n'importe quel service comme indiqué dans d'autres réponses

    $http.get(dataUrl)
    .success(function (data){
        $scope.templateData = data;
    })
    .error(function (error, status){
        $scope.data.error = { message: error, status: status};
        console.log($scope.data.error.status);
if(status == CODE_CONFIGURED_ON_SERVER_SIDE_FOR_NON_LOGGED_IN){
//redirect to login
  });

Remarque: - Je mettrai à jour plus demain ou à l'avenir

Ravinder Payal
la source
-1

Vous devez vérifier l'authentification des utilisateurs sur deux sites principaux.

  • Lorsque les utilisateurs changent d'état, le vérifier à l'aide du '$routeChangeStart'rappel
  • Lorsqu'une requête $ http est envoyée depuis angular, à l'aide d'un intercepteur.
levi
la source