해결책은 'notAuthorized'이벤트를 브로드 캐스트하고 기본 범위에서 포착하여 위치를 다시 변경하는 것입니다. 나는 그것이 최선의 해결책이 아니라고 생각하지만 그것은 나를 위해 일했습니다.
myApp.run(['$rootScope', 'LoginService',
function ($rootScope, LoginService) {
$rootScope.$on('$routeChangeStart', function (event, next, current) {
var authorizedRoles = next.data ? next.data.authorizedRoles : null;
if (LoginService.isAuthenticated()) {
if (!LoginService.isAuthorized(authorizedRoles)) {
$rootScope.$broadcast('notAuthorized');
}
}
});
}
]);
내 주 컨트롤러에서 :
$scope.$on('notAuthorized', function(){
$location.path('/forbidden');
});
참고 : 각도 사이트에서이 문제에 대한 토론이 아직 해결되지 않았습니다.
https://github.com/angular/angular.js/pull/4192
편집하다:
의견에 답하기 위해 LoginService 작동에 대한 자세한 정보가 있습니다. 3 가지 기능이 있습니다.
- login () (이름이 오해의 소지가 있음) (이전에) 로그인 한 사용자에 대한 정보를 얻기 위해 서버에 요청합니다. 서버에 현재 사용자 상태를 채우는 또 다른 로그인 페이지가 있습니다 (SpringSecurity 프레임 워크 사용). 내 웹 서비스는 상태 비 저장이 아니지만 유명한 프레임 워크가 내 보안을 처리하도록하는 것을 선호했습니다.
- isAuthenticated ()는 클라이언트 세션이 데이터로 채워져 있는지 검색합니다. 즉, (*) 전에 인증되었음을 의미합니다.
- isAuthorized ()가 액세스 권한을 처리했습니다 (이 항목의 범위를 벗어남).
(*) 내 세션은 경로 변경시 채워집니다. 비어있을 때 세션을 채우기 위해 when () 메서드를 재정의했습니다.
다음은 코드입니다.
services.factory('LoginService', ['$http', 'Session', '$q',
function($http, Session, $q){
return {
login: function () {
var defer = $q.defer();
$http({method: 'GET', url: restBaseUrl + '/currentUser'})
.success(function (data) {
defer.resolve(data);
});
return defer.promise;
},
isAuthenticated: function () {
return !!Session.userLogin;
},
isAuthorized: function (authorizedRoles) {
if (!angular.isArray(authorizedRoles)) {
authorizedRoles = [authorizedRoles];
}
return (this.isAuthenticated() && authorizedRoles.indexOf(Session.userRole) !== -1);
}
};
}]);
myApp.service('Session', ['$rootScope',
this.create = function (userId,userLogin, userRole, userMail, userName, userLastName, userLanguage) {
this.userId = userId;
this.userLogin = userLogin;
this.userRole = userRole;
this.userMail = userMail;
this.userName = userName;
this.userLastName = userLastName;
this.userLanguage = userLanguage;
};
this.destroy = function () {
this.userId = null;
this.userLogin = null;
this.userRole = null;
this.userMail = null;
this.userName = null;
this.userLastName = null;
this.userLanguage = null;
sessionStorage.clear();
};
return this;
}]);
myApp.config(['$routeProvider', 'USER_ROLES', function ($routeProvider, USER_ROLES) {
$routeProvider.accessWhen = function (path, route) {
if (route.resolve == null) {
route.resolve = {
user: ['LoginService','Session',function (LoginService, Session) {
if (!LoginService.isAuthenticated())
return LoginService.login().then(function (data) {
Session.create(data.id, data.login, data.role, data.email, data.firstName, data.lastName, data.language);
return data;
});
}]
}
} else {
for (key in route.resolve) {
var func = route.resolve[key];
route.resolve[key] = ['LoginService','Session','$injector',function (LoginService, Session, $injector) {
if (!LoginService.isAuthenticated())
return LoginService.login().then(function (data) {
Session.create(data.id, data.login, data.role, data.email, data.firstName, data.lastName, data.language);
return func(Session, $injector);
});
else
return func(Session, $injector);
}];
}
}
return $routeProvider.when(path, route);
};
$routeProvider.
accessWhen('/home', {
templateUrl: 'partials/dashboard.html',
controller: 'DashboardCtrl',
data: {authorizedRoles: [USER_ROLES.superAdmin, USER_ROLES.admin, USER_ROLES.system, USER_ROLES.user]},
resolve: {nextEvents: function (Session, $injector) {
$http = $injector.get('$http');
return $http.get(actionBaseUrl + '/devices/nextEvents', {
params: {
userId: Session.userId, batch: {rows: 5, page: 1}
},
isArray: true}).then(function success(response) {
return response.data;
});
}
}
})
...
.otherwise({
redirectTo: '/home'
});
}]);