使用AngularJS對路由進行安全性處理的方法

來源:互聯網
上載者:User

   這篇文章主要介紹了使用AngularJS對路由進行安全性處理的方法,AngularJS是一款高人氣的JavaScript庫,需要的朋友可以參考下

  簡介

  自從出現以後,AngularJS已經被使用很長時間了。 它是一個用於開發單頁應用(SPA)的javascript架構。 它有一些很好的特性,如雙向繫結、指令等。 這篇文章主要介紹Angular路由安全性策略。 它是一個可用Angular開發實現的用戶端安全性架構。 我已經對它進行了測試。 除了保證用戶端路由安全性外,你也需要保證伺服器端訪問的安全性。 用戶端安全性策略有助於減少對伺服器進行額外的訪問。 然而,如果一些人採用欺騙瀏覽器的手段訪問伺服器,那麼伺服器端安全性策略應當能夠拒絕未授權的訪問。 在這篇文章中,我僅對用戶端安全性策略進行討論。

  1 在應用模組層面定義全域變數

  為應用定義角色:

  ?

1 2 3 4 5 var roles = { superUser: 0, admin: 1, user: 2 };

  為應用定義未授權訪問的路由:

  ?

1 var routeForUnauthorizedAccess = '/SomeAngularRouteForUnauthorizedAccess';

  2 定義授權服務

  ?

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 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(); } } }; });

  3 加密路由

  然後讓我們用我們的努力成果來加密路由:

  ?

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 var appModule = angular.module("appModule", ['ngRoute', 'ngResource']) .config(function ($routeProvider, $locationProvider) { $routeProvider .when('/superUserSpecificRoute', { templateUrl: '/templates/superUser.html', // 路由的 view/template 路徑 caseInsensitiveMatch: true, controller: 'superUserController', // 路由的 angular 控制器 resolve: { // 在這我們將使用我們上面的努力成果,調用授權服務 // resolve 是 angular 中一個非常贊的特性,可以確保 // 只有當它下面提到的承諾被處理之後 // 才將控制器(在本例中是 superUserController)應用到路由。 permission: function (authorizationService, $route) { return authorizationService.permissionCheck([roles.superUser]); }, } }) .when('/userSpecificRoute', { templateUrl: '/templates/user.html', caseInsensitiveMatch: true, controller: 'userController', resolve: { permission: function (authorizationService, $route) { return authorizationService.permissionCheck([roles.user]); }, } }) .when('/adminSpecificRoute', { templateUrl: '/templates/admin.html', caseInsensitiveMatch: true, controller: 'adminController', resolve: { permission: function (authorizationService, $route) { return authorizationService.permissionCheck([roles.admin]); }, } }) .when('/adminSuperUserSpecificRoute', { templateUrl: '/templates/adminSuperUser.html', caseInsensitiveMatch: true, controller: 'adminSuperUserController', resolve: { permission: function (authorizationService, $route) { return authorizationService.permissionCheck([roles.admin, roles.superUser]); }, } }); });
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.