亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

使用AngularJS對(duì)路由進(jìn)行安全性處理的方法

 更新時(shí)間:2015年06月18日 11:54:21   投稿:goldensun  
這篇文章主要介紹了使用AngularJS對(duì)路由進(jìn)行安全性處理的方法,AngularJS是一款高人氣的JavaScript庫(kù),需要的朋友可以參考下

 簡(jiǎn)介

自從出現(xiàn)以后,AngularJS已經(jīng)被使用很長(zhǎng)時(shí)間了。 它是一個(gè)用于開(kāi)發(fā)單頁(yè)應(yīng)用(SPA)的javascript框架。 它有一些很好的特性,如雙向綁定、指令等。 這篇文章主要介紹Angular路由安全性策略。 它是一個(gè)可用Angular開(kāi)發(fā)實(shí)現(xiàn)的客戶(hù)端安全性框架。 我已經(jīng)對(duì)它進(jìn)行了測(cè)試。 除了保證客戶(hù)端路由安全性外,你也需要保證服務(wù)器端訪(fǎng)問(wèn)的安全性。 客戶(hù)端安全性策略有助于減少對(duì)服務(wù)器進(jìn)行額外的訪(fǎng)問(wèn)。 然而,如果一些人采用欺騙瀏覽器的手段訪(fǎng)問(wèn)服務(wù)器,那么服務(wù)器端安全性策略應(yīng)當(dāng)能夠拒絕未授權(quán)的訪(fǎng)問(wèn)。 在這篇文章中,我僅對(duì)客戶(hù)端安全性策略進(jìn)行討論。

1  在應(yīng)用模塊層面定義全局變量

為應(yīng)用定義角色:
 

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

為應(yīng)用定義未授權(quán)訪(fǎng)問(wèn)的路由:

var routeForUnauthorizedAccess = '/SomeAngularRouteForUnauthorizedAccess';

2 定義授權(quán)服務(wù)
 

appModule.factory('authorizationService', function ($resource, $q, $rootScope, $location) {
  return {
    // 將權(quán)限緩存到 Session,以避免后續(xù)請(qǐng)求不停的訪(fǎng)問(wèn)服務(wù)器
    permissionModel: { permission: {}, isPermissionLoaded: false },
 
    permissionCheck: function (roleCollection) {
      // 返回一個(gè)承諾(promise).
      var deferred = $q.defer();
 
      // 這里只是在承諾的作用域中保存一個(gè)指向上層作用域的指針。
      var parentPointer = this;
 
      // 檢查是否已從服務(wù)獲取到權(quán)限對(duì)象(已登錄用戶(hù)的角色列表)
      if (this.permissionModel.isPermissionLoaded) {
 
        // 檢查當(dāng)前用戶(hù)是否有權(quán)限訪(fǎng)問(wèn)當(dāng)前路由
        this.getPermission(this.permissionModel, roleCollection, deferred);
      } else {
        // 如果還沒(méi)權(quán)限對(duì)象,我們會(huì)去服務(wù)端獲取。
        // 'api/permissionService' 是本例子中的 web 服務(wù)地址。
 
        $resource('/api/permissionService').get().$promise.then(function (response) {
          // 當(dāng)服務(wù)器返回之后,我們開(kāi)始填充權(quán)限對(duì)象
          parentPointer.permissionModel.permission = response;
 
          // 將權(quán)限對(duì)象處理完成的標(biāo)記設(shè)為 true 并保存在 Session,
          // Session 中的用戶(hù),在后續(xù)的路由請(qǐng)求中可以重用該權(quán)限對(duì)象
          parentPointer.permissionModel.isPermissionLoaded = true;
 
          // 檢查當(dāng)前用戶(hù)是否有必須角色訪(fǎng)問(wèn)該路由
          parentPointer.getPermission(parentPointer.permissionModel, roleCollection, deferred);
        }
        );
      }
      return deferred.promise;
    },
 
    //方法:檢查當(dāng)前用戶(hù)是否有必須角色訪(fǎng)問(wèn)該路由
    //'permissionModel' 保存了從服務(wù)端返回的當(dāng)前用戶(hù)的角色信息
    //'roleCollection' 保存了可訪(fǎng)問(wèn)當(dāng)前路由的角色列表
    //'deferred' 是用來(lái)處理承諾的對(duì)象
    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) {
        // 如果用戶(hù)沒(méi)有必須的權(quán)限,我們把用戶(hù)引導(dǎo)到無(wú)權(quán)訪(fǎng)問(wèn)頁(yè)面
        $location.path(routeForUnauthorizedAccess);
        // 由于這個(gè)處理會(huì)有延時(shí),而這期間頁(yè)面位置可能發(fā)生改變, 
        // 我們會(huì)一直監(jiān)視 $locationChangeSuccess 事件
        // 并且當(dāng)該事件發(fā)生的時(shí),就把掉承諾解決掉。
        $rootScope.$on('$locationChangeSuccess', function (next, current) {
          deferred.resolve();
        });
      } else {
        deferred.resolve();
      }
    }
  };
});

3 加密路由

然后讓我們用我們的努力成果來(lái)加密路由:
 

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: {
          // 在這我們將使用我們上面的努力成果,調(diào)用授權(quán)服務(wù)
          // resolve 是 angular 中一個(gè)非常贊的特性,可以確保
          // 只有當(dāng)它下面提到的承諾被處理之后
          // 才將控制器(在本例中是 superUserController)應(yīng)用到路由。
          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]);
          },
        }
      });
  });

相關(guān)文章

  • AngularJS實(shí)現(xiàn)元素顯示和隱藏的幾個(gè)案例

    AngularJS實(shí)現(xiàn)元素顯示和隱藏的幾個(gè)案例

    這篇文章主要介紹了AngularJS實(shí)現(xiàn)元素顯示和隱藏的幾個(gè)案例,需要的朋友可以參考下
    2015-12-12
  • 玩轉(zhuǎn)Koa之koa-router原理解析

    玩轉(zhuǎn)Koa之koa-router原理解析

    本文將要分析的是經(jīng)常用到的路由中間件 -- koa-router,詳細(xì)的介紹了koa-router概述和實(shí)現(xiàn),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-12-12
  • AngularJs bootstrap搭載前臺(tái)框架——準(zhǔn)備工作

    AngularJs bootstrap搭載前臺(tái)框架——準(zhǔn)備工作

    本文主要介紹AngularJs bootstrap搭載前臺(tái)框架,這里對(duì)Bootstrap 搭載環(huán)境,及注意事項(xiàng)做了講解,有需要的小伙伴可以參考下
    2016-09-09
  • 將angular.js項(xiàng)目整合到.net mvc中的方法詳解

    將angular.js項(xiàng)目整合到.net mvc中的方法詳解

    這篇文章主要給大家介紹了將angular.js項(xiàng)目整合到.net mvc中的相關(guān)資料,文中通過(guò)示例代碼將實(shí)現(xiàn)的過(guò)程介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面跟著小編來(lái)一起看看吧。
    2017-06-06
  • angular.element方法匯總

    angular.element方法匯總

    本文主要給大家匯總了一下angular.element的方法,十分的詳細(xì),這里推薦給大家 參考下。
    2015-01-01
  • AngularJS基礎(chǔ) ng-dblclick 指令用法

    AngularJS基礎(chǔ) ng-dblclick 指令用法

    本文主要介紹AngularJS ng-dblclick 指令,這里對(duì)ng-dblclick基礎(chǔ)資料整理并詳細(xì)介紹,簡(jiǎn)單的代碼實(shí)例和實(shí)現(xiàn)效果,希望能幫助學(xué)習(xí)AngularJS的朋友
    2016-08-08
  • AngularJS仿蘋(píng)果滑屏刪除控件

    AngularJS仿蘋(píng)果滑屏刪除控件

    前端開(kāi)發(fā)中,為了對(duì)列表項(xiàng)進(jìn)行快捷操作,有時(shí)就添個(gè)按鈕來(lái)簡(jiǎn)單實(shí)現(xiàn)。但是,有時(shí)會(huì)發(fā)現(xiàn)按鈕影響美觀,甚至影響列表行的布局。稍在網(wǎng)上搜索無(wú)果,而寫(xiě)此仿蘋(píng)果滑屏刪除控件
    2016-01-01
  • angularjs 源碼解析之scope

    angularjs 源碼解析之scope

    $scope 的使用貫穿整個(gè) Angular App 應(yīng)用,它與數(shù)據(jù)模型相關(guān)聯(lián),同時(shí)也是表達(dá)式執(zhí)行的上下文.有了 $scope 就在視圖和控制器之間建立了一個(gè)通道,基于作用域視圖在修改數(shù)據(jù)時(shí)會(huì)立刻更新 $scope,同樣的 $scope 發(fā)生改變時(shí)也會(huì)立刻重新渲染視圖.
    2016-08-08
  • 淺談angular2子組件的事件傳遞(任意組件事件傳遞)

    淺談angular2子組件的事件傳遞(任意組件事件傳遞)

    今天小編就為大家分享一篇淺談angular2子組件的事件傳遞(任意組件事件傳遞),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-09-09
  • Angular整合zTree的示例代碼

    Angular整合zTree的示例代碼

    本篇文章主要介紹了Angular整合zTree的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-01-01

最新評(píng)論