我已经阅读了很多关于如何在Angular应用程序中实现身份验证的不同示例。我使用Firebase Simple Login作为(No-)后端。
用户只有在登录后才能看到我应用的任何内容。如果他们已注销,他们只能看到/auth/login
和/auth/register
。目前,我有以下解决方案可行。但是:
1)我不确定这是否是防弹因为......
2)...当我在未登录时手动打开/home
时,我正确地被重定向到/auth/login
,但无论如何都会执行HomeCtrl
。没有敏感数据暴露,因为没有从后端返回数据,但是如果我已经注销,必须有一种方法不执行控制器吗?
3)每次我暴露敏感数据时,如果用户经过一次又一次的身份验证,我是否必须检查控制器内部?
加分问题:成功登录后如何重定向到/home
?目前,在我的AuthService内部,我在成功登录时$location.path('home');
,但是这并没有说明状态?!
我的app.js:
angular.module('myApp', ['ionic', 'firebase', 'myApp.services', 'myApp.controllers'])
.run(function($rootScope, $location, AuthService) {
$rootScope.$on('$stateChangeStart', function (ev, to, toParams, from, fromParams) {
/**
* AuthService.isLoggedIn() returns TRUE or FALSE
* depending on whether user authenticated successfully
* against the Firebase backend
*/
// redirect to login
if (!AuthService.isLoggedIn() && to.name !== 'auth.register') {
$location.path('/auth/login');
}
});
})
.config(function($stateProvider, $urlRouterProvider) {
$stateProvider
.state('auth', {
url: "/auth",
abstract: true,
templateUrl: "templates/auth-tabs.html",
controller: 'AuthCtrl'
})
.state('auth.login', {
url: '/login',
views: {
'login-tab': {
templateUrl: 'templates/auth-login.html'
}
}
})
.state('auth.register', {
url: '/register',
views: {
'register-tab': {
templateUrl: 'templates/auth-register.html'
}
}
})
.state('home', {
url: '/home',
templateUrl: 'templates/home.html',
controller: 'HomeCtrl'
});
$urlRouterProvider.otherwise('/home');
});
答案 0 :(得分:1)
我实现它的方法是处理401
http服务器响应,因为我不想担心检查用户身份验证状态,我更喜欢让服务器处理它。话虽如此。
$urlRouter.sync()
上的文档指定如果您阻止默认事件,则可以手动触发succesChange
angular.module('app', ['ui.router']);
.run(function($rootScope, $urlRouter) {
$rootScope.$on('$locationChangeSuccess', function(evt) {
// Halt state change from even starting
evt.preventDefault();
// Perform custom logic
var meetsRequirement = ...
// Continue with the update and state transition if logic allows
if (meetsRequirement) $urlRouter.sync();
});
});