web-dev-qa-db-fra.com

Comment ignorer la page de connexion si l'utilisateur est déjà connecté dans ionic framework

Je travaille sur une applicationIONICdans laquelle j'ai vérifié si l'utilisateur est déjà connecté et si l'utilisateur est déjà connecté, l'application doit être redirigée sur le tableau de bord. Cette fonctionnalité fonctionne bien, mais l'application affiche d'abord la page de connexion pendant quelques secondes, puis redirige vers le tableau de bord.

app.js  

$rootScope.$on("$locationChangeStart", function (event, next, current) {
    var prefs = plugins.appPreferences;
    prefs.fetch('iuserid').then(function (value) {
        if (value != '') {
            $state.go('app.dashboard');
        }
    });
.config(function ($stateProvider, $urlRouterProvider, $httpProvider) {
    $stateProvider
        .state('app', {
            url: "/app",
            abstract: true,
            templateUrl: "templates/menu.html",
            controller: 'AppCtrl'
        })
        .state('login', {
            url: "/login",
            templateUrl: "templates/login.html",
            controller: 'LoginCtrl'
        })
        .state('app.dashboard', {
            url: "/dashboard",
            views: {
                'menuContent': {
                    templateUrl: "templates/dashboard.html",
                    controller: 'DashboardCtrl'
                }
            }
        })
        ;
    // if none of the above states are matched, use this as the fallback
    $urlRouterProvider.otherwise('/login');
    });
});

Je ne sais pas où je me trompe.

Edit: Je peux authentifier et rediriger vers le tableau de bord mais mon problème est la page de connexion affichée pendant quelques secondes (maximum 2 secondes), puis rediriger vers le tableau de bord et je travaille surIONICapplication

Deuxième édition J'ai trouvé le problème mais je ne connais pas la solution. Les préférences fonctionnent beaucoup dans $ ionicPlatform.ready mais ne fonctionnent pas dans $ locationChangeStart. Et j'ai besoin de préférence dans $ locationChangeStart car il est exécuté avant $ ionicPlatformReady J'ai désespérément besoin de la solution. 

16
Alpesh Trivedi

Je fais ce qui suit:

dans l'app.js

.state('login', {
    url: "/login",
    templateUrl     : "templates/session/login.html",
    controller      : 'SessionCtrl'
  })

  .state('register', {
    url: "/register",
    templateUrl     : "templates/session/register.html",
    controller      : 'SessionCtrl'
  })
  .state('app', {
    url: "/app",
    abstract: true,
    templateUrl     : "templates/menu.html",
    controller      : 'AppCtrl',
    onEnter: function($state, Auth){
        if(!Auth.isLoggedIn()){
           $state.go('login');
        }
    }
  })
  .state('app.main', {
    url: "/main",
    views: {
      'menuContent': {
        templateUrl   : "templates/main_menu.html",
        controller    : "MainMenuCtrl"
      }
    }
  })

  $urlRouterProvider.otherwise('/app/main');

Auth est une usine, il stocke la session d'authentification dans le stockage local.

angular.module('auth.services', [])
.factory('Auth', function () {
   if (window.localStorage['session']) {
      var _user = JSON.parse(window.localStorage['session']);
   }
   var setUser = function (session) {
      _user = session;
      window.localStorage['session'] = JSON.stringify(_user);
   }

   return {
      setUser: setUser,
      isLoggedIn: function () {
         return _user ? true : false;
      },
      getUser: function () {
         return _user;
      },
      logout: function () {
         window.localStorage.removeItem("session");
         window.localStorage.removeItem("list_dependents");
         _user = null;
      }
   }
});
31
Mikel Sanchez

Retirer 

$urlRouterProvider.otherwise('/loginpage')

au bas du fichier routes.js.

0
Murtuza

Je pense que vous devriez écouter l'événement $stateChangeStart sur le $rootScope, vous pouvez écouter cet événement pendant l'exécution, comme ceci:

angular.module("myapp.permission").run($rootScope){
    $rootScope.$on('$stateChangeStart', function (event, toState, toParams, fromState, fromParams) {
        var loggedIn = true;
        if(loggedIn) {
            $state.go('app.dashboard');
        }
    }
}
0
Mark Veenstra

Les gars essaient cette solution élégante:

  1. si l'utilisateur n'est pas connecté et que la connexion est requise, il est redirigé vers la connexion.

  2. si l'utilisateur essaie de se connecter et qu'il s'est déjà connecté, empêchez-le de le faire.

  3. marquez chaque chemin comme "requireAuth" et cela fonctionnera.

  4. placez votre code dans app.js

    .run(function ($rootScope, $location, authService) {
        $rootScope.$on('$stateChangeStart', function (ev, to, toParams, from, fromParams) {
            if (to.requireAuth && !authService.isAuthed()) {
                $location.path("/login");
            }
            else if (to.name == 'login' && authService.isAuthed()) {
                ev.preventDefault();
                $location.path("/dashboard");
            }
        });
    })
    
0
Liad Livnat