首页 > 解决方案 > Ionic 1 - 如果用户未登录则显示登录页面,如果用户已登录则跳过

问题描述

在需要以下用户登录功能的 Ionic 1.3.3 版应用程序上工作。我已经浏览了所有 stackoverflow 答案,但没有找到适合我的可行解决方案。

  1. 如果用户已经登录,应用程序将在启动时检查(通过 Ionic $localstorage 检查)然后重定向到主页
  2. 如果用户未登录,则在应用启动时重定向到登录页面
  3. 登录成功后在登录页面重定向到主页并清除登录页面历史记录。

    angular.module('starter', ['ionic', 'starter.controllers', 'starter.directives', 'starter.services', 'ngStorage','ab-base64',])
    .config(function ($stateProvider, $urlRouterProvider) {
            $stateProvider
              .state('app', {
                  url: '/app',
                  abstract: true,
                  cache: false,
                  templateUrl: 'templates/menu.html',
                  controller: 'AppCtrl',
                  onEnter: function ($state) {
                     console.log($state);
                  }
              })
             .state('app.home', {
                 cache: false,
                 url: '/home',
                 views: {
                   'menuContent': {
                    templateUrl: 'templates/home.html'
                 }
               }
            })
            .state('app.login', {
                cache: false,
                url: '/login/:username/:password',
                views: {
                'menuContent': {
                   templateUrl: 'templates/login.html',
                   controller: 'LoginController'
                }
               }
            })
            .state('app.profile', {
                  cache: false,
                  url: '/profile',
                  views: {
                    'menuContent': {
                     templateUrl: 'templates/profile.html',
                     controller: 'ProfileController'
                  }
               }
            })
            $urlRouterProvider.otherwise('/app/home');
        })
    

标签: angularjsangular-ui-routerionic-v1

解决方案


这就是我在 Ionic v1 中完成此操作的方式:对于用户登录时的重定向:

.state("app.dash", {
    url: "/dashboard",
    abstract: true,
    views: {
      mainContent: {
        templateUrl: "templates/dashboard.html",
        controller: "DashboardCtrl",
        controllerAs: "vm",
        resolve: {
          auth: [
            "authService",
            function(authService) {
              return authService.isAuthenticated();
            }
          ],
          permissions: [
            "authService",
            function(authService) {
              return authService.getPermissions();
            }
          ]
        }
      }
    }
  })

用于用户登录或已登录时的重定向。

.state("app.login", {
    url: "/login?accountCreated",
    views: {
      mainContent: {
        templateUrl: "templates/login.html",
        controller: "LoginCtrl",
        controllerAs: "vm",
        resolve: {
          isLoggedIn: [
            "$q",
            "$state",
            "authService",
            function($q, $state, authService) {
              authService.isAuthenticated().then(function(res) {
                $state.go("app.dash.home");
              });
              return $q.defer().resolve();
            }
          ]
        }
      }
    }
  })

身份验证服务 isAuthenticated()

function isAuthenticated() {
  var deferred = $q.defer();

  getToken().then(function(token) {
    isExpired().then(function(isExpired) {
      if (!token || isExpired) {
        deferred.reject("Not Authenticated");
      } else {
        decodeToken().then(function(decodedToken) {
          deferred.resolve(decodedToken);
        });
      }
    });
  });

  return deferred.promise;
}

推荐阅读