একটি সমাধান হ'ল 'অনুমোদিত নয়' ইভেন্টটি সম্প্রচার করা এবং অবস্থানটি পুনরায় পরিবর্তন করার জন্য এটি মূল সুযোগে ধরা। আমি মনে করি এটি সেরা সমাধান নয়, তবে এটি আমার পক্ষে কাজ করেছে:
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
সম্পাদনা:
মন্তব্যের জবাব দেওয়ার জন্য, এখানে লগইন সার্ভিস সম্পর্কে আরও তথ্য কাজ করা আছে। এটিতে 3 টি কার্য রয়েছে:
- লগইন () (নামটি বিভ্রান্তিমূলক) লগ-ইন করা ব্যবহারকারী সম্পর্কে তথ্য পেতে সার্ভারের কাছে একটি অনুরোধ করে। এখানে আরও একটি লগইন পৃষ্ঠা রয়েছে যা কেবলমাত্র বর্তমান ব্যবহারকারী অবস্থাটি সার্ভারে সজ্জিত করে (স্প্রিংসিকিউরিটি ফ্রেমওয়ার্ক ব্যবহার করে) আমার ওয়েব পরিষেবাদি সত্যই রাষ্ট্রহীন নয়, তবে আমি সেই বিখ্যাত কাঠামোটিকে আমার সুরক্ষা পরিচালনা করতে দেওয়া পছন্দ করেছিলাম preferred
- #Anthenticated () ক্লায়েন্ট সেশনটি ডেটা ভরাট করা সন্ধান করুন, যার অর্থ এটি আগে (*) প্রমাণীকরণ করা হয়েছে
- isAuthorised () হ্যান্ডেল অ্যাক্সেস রাইটস (এই বিষয়টির সুযোগের বাইরে)।
(*) রুট পরিবর্তন হলে আমার সেশনটি জনবহুল হয়। আমি তখন () পদ্ধতিটি ফাঁকা হয়ে গেলে সেশনটি পপুলেট করার জন্য ওভাররাইড করেছি।
কোডটি এখানে:
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'
});
}]);