首頁 >web前端 >js教程 >使用AngularJS對路由進行安全性處理的方法

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

高洛峰
高洛峰原創
2017-02-06 11:56:061244瀏覽

 簡介

自從出現以後,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網!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn