angularjs - Ionic 1 - 如果用户未登录则显示登录页面,如果用户已登录则跳过
问题描述
在需要以下用户登录功能的 Ionic 1.3.3 版应用程序上工作。我已经浏览了所有 stackoverflow 答案,但没有找到适合我的可行解决方案。
- 如果用户已经登录,应用程序将在启动时检查(通过 Ionic $localstorage 检查)然后重定向到主页
- 如果用户未登录,则在应用启动时重定向到登录页面
登录成功后在登录页面重定向到主页并清除登录页面历史记录。
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'); })
解决方案
这就是我在 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;
}
推荐阅读
- connection - Apache Airflow 中与 redshift 的连接错误
- laravel - 添加新的刀片指令(前缀和后缀字段?)[PhpStorm]
- postgresql - 如何将 SELECT 嵌套到 PL/pgSQL 中的 UPDATE 语句中
- python - Google Colab 没有更新软件包?
- laravel - 使用带有 MorpMany 关系的 toHasOne 宏
- sql - SQL排序和最后一条记录
- python - Python - 如何将数据从类(而不是实例)移动到数据库并链接在一起?
- python - python pandas multiindex减去具有匹配级别1索引的行
- c++ - unique_ptr 作为模板参数
- javascript - javascript中“删除”关键字的奇怪行为