我需要限制用户进行重定向,只需要通过身份验证登录。
我试过但我可以使用后退按钮重定向到登录页面,然后使用前进按钮再次访问同一页面。即使我可以在没有登录的情况下使用URL转到所需的页面。
我的代码:
config.$inject = ['$routeProvider', '$locationProvider'];
function config($routeProvider, $locationProvider ) {
$routeProvider
.when('/login', {
controller: 'LoginController',
templateUrl: 'view/login.view.html',
controllerAs: 'vm'
})
.when('/profileData', {
controller: 'profileDataController',
templateUrl: 'view/profiledata.view.html',
controllerAs :'vm'
})
.when('/questionBank', {
controller: 'questionbankController',
templateUrl: 'view/questionbank.view.html',
controllerAs: 'vm'
})
.when('/dashboard', {
// controller: 'PersonalInfoController',
templateUrl: 'view/dashboard.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(), ['/dashboard','/questionBank', '/profileData']) === -1;
/* var a = $location.$$absUrl.split('#')[1];
var patt = new RegExp(a);
var res = patt.test(restrictedPage); */
var loggedIn = $rootScope.globals.currentUser;
if (restrictedPage && !loggedIn) {
$location.path('/login');
}
});
}
答案 0 :(得分:1)
使用此:基于服务器的响应
.when('/login', {
controller: 'LoginController',
templateUrl: 'view/login.view.html',
resolve:{
logincheck: checklogedin
})
/ resolve function for user....
var checklogedin = function($q ,$http,$location)
{
var deferred =$q.defer();
$http.get('/loggedin').success(function(user){
if (user.staus==true)
{
//goo
deferred.resolve();
}
else
{
deferred.reject();
$location.url('/login');
}
});
return deferred.promise
};
答案 1 :(得分:0)
根据您提供的代码,我无法告诉100%您的代码中发生了什么。但是......你总是可以尝试在每个路由上使用resolve
属性,而不希望在没有身份验证的情况下允许访问。以下是questionBank
的内容:
.when('/questionBank', {
controller: 'questionbankController',
templateUrl: 'view/questionbank.view.html',
controllerAs: 'vm',
resolve: {
auth: function(AuthService, $q){
if(AuthService.isAuthenticated()) return $q.resolve();
return $q.reject();
}
}
})
resolve对象的每个属性都应返回一个promise,如果解析了......路由更改有效。如果拒绝......则不允许更改路线。如果承诺永远不会解决,那么你就会被搞砸,所以要确保它已经解决,否则它将永远无法解决。
这不是尝试你所说的唯一方法。这是尝试它的一种方式。
答案 2 :(得分:0)
You can also add event listener on your $scope and prevent moving in case of unauthenticated user.
$scope.$on('$locationChangeStart', function (event, next, current) {
if (!is_logged_in) {
event.preventDefault();
}
});
答案 3 :(得分:0)
在我的代码中,我有两个主控制器LoginCtrl
和AppCtrl
,所有其他控制器都嵌套在AppCtrl
中。然后在AppCtrl
我有这个代码,它将检查登录用户。
if (localStorageService.get('authToken') === null) {
$state.go('login', {locale: CONFIG.defaultLang});
} else if (!userService.isLoggedIn()) {
tokenStorage.setAuthToken(localStorageService.get('authToken'));
userService.setIdentity(JSON.parse(localStorageService.get('user')));
}
如您所见,我将服务器中的身份验证令牌存储在本地存储中。页面loades时,将执行此代码,如果您未登录,则将重定向。并且因为所有其他应用程序控制器都嵌套在AppCtrl
中,所以每次都会执行此代码。
有关嵌套控制器的更多信息,请尝试本文 - https://rclayton.silvrback.com/parent-child-controller-communication