簡介
自從出現以後,AngularJS已經被使用很久了。 它是一個用於開發單頁應用(SPA)的javascript框架。 它有一些很好的特性,如雙向綁定、指令等。 這篇文章主要介紹Angular路由安全策略。 它是一個可用Angular開發實作的客戶端安全性框架。 我已經對它進行了測試。 除了確保客戶端路由安全性外,你還需要確保伺服器端存取的安全性。 客戶端安全性策略有助於減少對伺服器進行額外的存取。 然而,如果有些人採用欺騙瀏覽器的手段存取伺服器,那麼伺服器端安全性原則應能拒絕未經授權的存取。 在這篇文章中,我僅對客戶端安全性策略進行討論。
1 在應用模組層面定義全域變數
為應用定義角色:
var roles = { superUser: 0, admin: 1, user: 2 };
為應用定義未授權存取的路由:
var routeForUnauthorizedAccess = '/SomeAngularRouteForUnauthorizedAccess';
3加密路由
appModule.factory('authorizationService', function ($resource, $q, $rootScope, $location) { return { // 将权限缓存到 Session,以避免后续请求不停的访问服务器 permissionModel: { permission: {}, isPermissionLoaded: false }, permissionCheck: function (roleCollection) { // 返回一个承诺(promise). var deferred = $q.defer(); // 这里只是在承诺的作用域中保存一个指向上层作用域的指针。 var parentPointer = this; // 检查是否已从服务获取到权限对象(已登录用户的角色列表) if (this.permissionModel.isPermissionLoaded) { // 检查当前用户是否有权限访问当前路由 this.getPermission(this.permissionModel, roleCollection, deferred); } else { // 如果还没权限对象,我们会去服务端获取。 // 'api/permissionService' 是本例子中的 web 服务地址。 $resource('/api/permissionService').get().$promise.then(function (response) { // 当服务器返回之后,我们开始填充权限对象 parentPointer.permissionModel.permission = response; // 将权限对象处理完成的标记设为 true 并保存在 Session, // Session 中的用户,在后续的路由请求中可以重用该权限对象 parentPointer.permissionModel.isPermissionLoaded = true; // 检查当前用户是否有必须角色访问该路由 parentPointer.getPermission(parentPointer.permissionModel, roleCollection, deferred); } ); } return deferred.promise; }, //方法:检查当前用户是否有必须角色访问该路由 //'permissionModel' 保存了从服务端返回的当前用户的角色信息 //'roleCollection' 保存了可访问当前路由的角色列表 //'deferred' 是用来处理承诺的对象 getPermission: function (permissionModel, roleCollection, deferred) { var ifPermissionPassed = false; angular.forEach(roleCollection, function (role) { switch (role) { case roles.superUser: if (permissionModel.permission.isSuperUser) { ifPermissionPassed = true; } break; case roles.admin: if (permissionModel.permission.isAdministrator) { ifPermissionPassed = true; } break; case roles.user: if (permissionModel.permission.isUser) { ifPermissionPassed = true; } break; default: ifPermissionPassed = false; } }); if (!ifPermissionPassed) { // 如果用户没有必须的权限,我们把用户引导到无权访问页面 $location.path(routeForUnauthorizedAccess); // 由于这个处理会有延时,而这期间页面位置可能发生改变, // 我们会一直监视 $locationChangeSuccess 事件 // 并且当该事件发生的时,就把掉承诺解决掉。 $rootScope.$on('$locationChangeSuccess', function (next, current) { deferred.resolve(); }); } else { deferred.resolve(); } } }; });
更多使用AngularJS對路由進行安全性處理的方法相關文章請關注PHP網!