ホームページ ウェブフロントエンド jsチュートリアル AngularJS_AngularJS でのユーザー アクセスのための ID 認証とフォーム検証機能の実装

AngularJS_AngularJS でのユーザー アクセスのための ID 認証とフォーム検証機能の実装

May 16, 2016 pm 03:04 PM
angular javascript js フォームの検証 認証

認証
最も一般的な権限の設計は、RBAC ロールベースのアクセス制御です。基本的な考え方は、システム操作のためのさまざまな権限が特定のユーザーに直接付与されるのではなく、ユーザー セットと権限セットの間にロール セットが確立されるというものです。各役割は、対応する権限のセットに対応します。
ユーザーに適切な役割が割り当てられると、ユーザーはこの役割のすべての操作権限を持ちます。この利点は、ユーザーを作成するたびに権限を割り当てる必要がなく、対応するロールをユーザーに割り当てるだけで済むことです。さらに、ロールの権限の変更はユーザーの権限の変更よりもはるかに少ないです。これにより、ユーザー権限の管理が簡素化され、システムのオーバーヘッドが軽減されます。
Angular で構築されたシングルページ アプリケーションでは、このようなアーキテクチャを実装するために、フロントエンド エンジニアが対処する必要がある箇所が 3 つほどあります。 1. UI 処理 (ユーザーが持つ権限に基づいてページ上の一部のコンテンツが表示されるかどうかを決定します)
2. ルーティング処理(アクセス権限のないURLにアクセスした場合、エラーページへジャンプ)
3. HTTP リクエストの処理 (データリクエストを送信したときに、返されたステータスが 401 または 403 の場合、通常はエラー ページにリダイレクトされます)

アクセス ID 制御の実装
まず、Angular を開始する前に現在のユーザーのすべての権限を取得する必要があります。次に、より洗練された方法は、ページ上のコンテンツが権限に従って表示されるかどうかを UI 処理するために、サービスを通じてこのマッピング関係を保存することです。これらを処理した後、ルートを追加するときに追加の「permission」属性を追加し、どのロールがこの URL にジャンプする権限を持っているかを示す値を割り当ててリッスンする必要があります。現在のユーザーがこの URL へのアクセス権を持っているかどうかを確認するには、最後に、リクエストによって返されたステータスが 401 または 403 の場合に監視し、エラー ページにジャンプするために HTTP インターセプターが必要です。作業はたくさんあるように見えますが、実際には 1 つずつ処理するのは非常に簡単です。
401 を返すと、loginCtrl を実行し、403 を返すと、PermissionCtrl を実行します。

Angular を実行する前に権限のマッピング関係を取得します
Angular プロジェクトは ng-app を通じて開始されますが、場合によっては、Angular プロジェクトの起動を制御下に置きたい場合があります。たとえば、この場合は、現在ログインしているユーザーのすべての権限マッピング関係を取得したいと考えています。幸いなことに、Angular 自体がこのメソッド (angular.bootstrap().
) を提供しています。

1

2

3

4

5

6

7

var permissionList;

angular.element(document).ready(function() {

 $.get('/api/UserPermission', function(data) {

 permissionList = data;

 angular.bootstrap(document, ['App']);

 });

});

ログイン後にコピー
よく見ると、ここで $.get() が使用されていることに気づくかもしれませんが、現時点では Angular が起動されていないため、Angular の $resource や $http の代わりに jQuery を使用するのが正しいです。まだ。

さらに上記のコードを使用すると、取得したマッピング関係をサービスに組み込み、グローバル変数として使用できます。

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

// app.js

var app = angular.module('myApp', []), permissionList;

  

app.run(function(permissions) {

 permissions.setPermissions(permissionList)

});

  

angular.element(document).ready(function() {

 $.get('/api/UserPermission', function(data) {

 permissionList = data;

 angular.bootstrap(document, ['App']);

 });

});

  

// common_service.js

angular.module('myApp')

 .factory('permissions', function ($rootScope) {

 var permissionList;

 return {

  setPermissions: function(permissions) {

  permissionList = permissions;

  $rootScope.$broadcast('permissionsChanged')

  }

 };

 });

ログイン後にコピー
現在のユーザーの権限セットを取得した後、このセットを対応するサービスにアーカイブし、さらに 2 つの作業を行いました:

(1) アクセス許可をファクトリー変数に保存し、名前空間を汚すことなくグローバル変数の役割を達成するためにメモリ内に残るようにします。
(2) 権限が変更されたときに $broadcast を通じてイベントをブロードキャストします。


1. 権限に基づいて UI コンポーネントが表示されるか非表示になるかを決定する方法
ここでは、権限関係に基づいて要素を表示または非表示にするディレクティブを自分で記述する必要があります。

1

2

3

4

5

6

7

8

9

<!-- If the user has edit permission the show a link -->

<div has-permission='Edit'>

 <a href="/#/courses/{{ id }}/edit"> {{ name }}</a>

</div>

  

<!-- If the user doesn't have edit permission then show text only (Note the "!" before "Edit") -->

<div has-permission='!Edit'>

 {{ name }}

</div>

ログイン後にコピー
ここでは、has-permission 属性を渡して現在のユーザーが権限を持っている場合は表示され、そうでない場合は非表示になります。

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

angular.module('myApp').directive('hasPermission', function(permissions) {

 return {

 link: function(scope, element, attrs) {

  if(!_.isString(attrs.hasPermission))

  throw "hasPermission value must be a string";

  

  var value = attrs.hasPermission.trim();

  var notPermissionFlag = value[0] === '!';

  if(notPermissionFlag) {

  value = value.slice(1).trim();

  }

  

  function toggleVisibilityBasedOnPermission() {

  var hasPermission = permissions.hasPermission(value);

  

  if(hasPermission && !notPermissionFlag || !hasPermission && notPermissionFlag)

   element.show();

  else

   element.hide();

  }

  toggleVisibilityBasedOnPermission();

  scope.$on('permissionsChanged', toggleVisibilityBasedOnPermission);

 }

 };

});

ログイン後にコピー
前のファクトリーを展開します:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

angular.module('myApp')

 .factory('permissions', function ($rootScope) {

 var permissionList;

 return {

  setPermissions: function(permissions) {

  permissionList = permissions;

  $rootScope.$broadcast('permissionsChanged')

  },

  hasPermission: function (permission) {

  permission = permission.trim();

  return _.some(permissionList, function(item) {

   if(_.isString(item.Name))

   return item.Name.trim() === permission

  });

  }

 };

 });

ログイン後にコピー

2. ルート上の権限に基づいてアクセス
この部分の実装の考え方は次のとおりです: ルートを定義するときに、現在の URL にアクセスするための権限属性を追加します。その後、routeChangeStart イベントを使用して監視します。 URL が変更されるたびに、ジャンプする現在の URL が条件を満たしているかどうかを確認し、正常にジャンプするか、間違ったプロンプト ページにジャンプするかを決定します。

mainController.js またはindexController.js (つまり、親コントローラー)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

app.config(function ($routeProvider) {

 $routeProvider

 .when('/', {

  templateUrl: 'views/viewCourses.html',

  controller: 'viewCoursesCtrl'

 })

 .when('/unauthorized', {

  templateUrl: 'views/error.html',

  controller: 'ErrorCtrl'

 })

 .when('/courses/:id/edit', {

  templateUrl: 'views/editCourses.html',

  controller: 'editCourses',

  permission: 'Edit'

 });

});

ログイン後にコピー

这里依然用到了之前写的hasPermission,这些东西都是高度可复用的.这样就搞定了,在每次view的route跳转前,在父容器的Controller中判断一些它到底有没有跳转的权限即可.

3.HTTP请求处理
这个应该相对来说好处理一点,思想的思路也很简单.因为Angular应用推荐的是RESTful风格的借口,所以对于HTTP协议的使用很清晰.对于请求返回的status code如果是401或者403则表示没有权限,就跳转到对应的错误提示页面即可.
当然我们不可能每个请求都去手动校验转发一次,所以肯定需要一个总的filter.代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

angular.module('myApp')

 .config(function($httpProvider) {

 $httpProvider.responseInterceptors.push('securityInterceptor');

 })

 .provider('securityInterceptor', function() {

 this.$get = function($location, $q) {

  return function(promise) {

  return promise.then(null, function(response) {

   if(response.status === 403 || response.status === 401) {

   $location.path('/unauthorized');

   }

   return $q.reject(response);

  });

  };

 };

 });

ログイン後にコピー

写到这里就差不多可以实现在这种前后端分离模式下,前端部分的权限管理和控制了。


表单验证
AngularJS 前端验证指令

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

var rcSubmitDirective = {

 'rcSubmit': function ($parse) {

 return {

  restrict: "A",

  require: [ "rcSubmit", "&#63;form" ],

  controller: function() {

  this.attempted = false;

  var formController = null;

  this.setAttempted = function() {

   this.attempted = true;

  };

  this.setFormController = function(controller) {

   formController = controller;

  };

  this.needsAttention = function(fieldModelController) {

   if (!formController) return false;

   if (fieldModelController) {

   return fieldModelController.$invalid && (fieldModelController.$dirty || this.attempted);

   } else {

   return formController && formController.$invalid && (formController.$dirty || this.attempted);

   }

  };

  },

  compile: function() {

  return {

   pre: function(scope, formElement, attributes, controllers) {

   var submitController = controllers[0];

   var formController = controllers.length > 1 &#63; controllers[1] : null;

   submitController.setFormController(formController);

   scope.rc = scope.rc || {};

   scope.rc[attributes.name] = submitController;

   },

   post: function(scope, formElement, attributes, controllers) {

   var submitController = controllers[0];

   var formController = controllers.length > 1 &#63; controllers[1] : null;

   var fn = $parse(attributes.rcSubmit);

   formElement.bind("submit", function(event) {

    submitController.setAttempted();

    if (!scope.$$phase) scope.$apply();

    if (!formController.$valid) return;

    scope.$apply(function() {

    fn(scope, {

     $event: event

    });

    });

   });

   }

  };

  }

 };

 }

};

ログイン後にコピー


验证通过

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

<form name="loginForm" novalidate

  ng-app="LoginApp" ng-controller="LoginController" rc-submit="login()">

 <div class="form-group"

   ng-class="{'has-error': rc.loginForm.needsAttention(loginForm.username)}">

  <input class="form-control" name="username" type="text"

    placeholder="Username" required ng-model="session.username" />

  <span class="help-block"

    ng-show="rc.form.needsAttention(loginForm.username) && loginForm.username.$error.required">Required</span>

 </div>

 <div class="form-group"

   ng-class="{'has-error': rc.loginForm.needsAttention(loginForm.password)}">

  <input class="form-control" name="password" type="password"

    placeholder="Password" required ng-model="session.password" />

  <span class="help-block"

    ng-show="rc.form.needsAttention(loginForm.password) && loginForm.password.$error.required">Required</span>

 </div>

 <div class="form-group">

  <button type="submit" class="btn btn-primary pull-right"

    value="Login" title="Login">

   <span>Login</span>

  </button>

 </div>

</form>

ログイン後にコピー

样式如下

2016421174922051.png (469×328)

前端验证通过会调用login()。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

推奨: 優れた JS オープンソースの顔検出および認識プロジェクト 推奨: 優れた JS オープンソースの顔検出および認識プロジェクト Apr 03, 2024 am 11:55 AM

顔の検出および認識テクノロジーは、すでに比較的成熟しており、広く使用されているテクノロジーです。現在、最も広く使用されているインターネット アプリケーション言語は JS ですが、Web フロントエンドでの顔検出と認識の実装には、バックエンドの顔認識と比較して利点と欠点があります。利点としては、ネットワーク インタラクションの削減とリアルタイム認識により、ユーザーの待ち時間が大幅に短縮され、ユーザー エクスペリエンスが向上することが挙げられます。欠点としては、モデル サイズによって制限されるため、精度も制限されることが挙げられます。 js を使用して Web 上に顔検出を実装するにはどうすればよいですか? Web 上で顔認識を実装するには、JavaScript、HTML、CSS、WebRTC など、関連するプログラミング言語とテクノロジに精通している必要があります。同時に、関連するコンピューター ビジョンと人工知能テクノロジーを習得する必要もあります。 Web 側の設計により、次の点に注意してください。

Ubuntu 24.04 に Angular をインストールする方法 Ubuntu 24.04 に Angular をインストールする方法 Mar 23, 2024 pm 12:20 PM

Angular.js は、動的アプリケーションを作成するための無料でアクセスできる JavaScript プラットフォームです。 HTML の構文をテンプレート言語として拡張することで、アプリケーションのさまざまな側面を迅速かつ明確に表現できます。 Angular.js は、コードの作成、更新、テストに役立つさまざまなツールを提供します。さらに、ルーティングやフォーム管理などの多くの機能も提供します。このガイドでは、Ubuntu24 に Angular をインストールする方法について説明します。まず、Node.js をインストールする必要があります。 Node.js は、ChromeV8 エンジンに基づく JavaScript 実行環境で、サーバー側で JavaScript コードを実行できます。ウブにいるために

WebSocket と JavaScript: リアルタイム監視システムを実装するための主要テクノロジー WebSocket と JavaScript: リアルタイム監視システムを実装するための主要テクノロジー Dec 17, 2023 pm 05:30 PM

WebSocketとJavaScript:リアルタイム監視システムを実現するためのキーテクノロジー はじめに: インターネット技術の急速な発展に伴い、リアルタイム監視システムは様々な分野で広く利用されています。リアルタイム監視を実現するための重要なテクノロジーの 1 つは、WebSocket と JavaScript の組み合わせです。この記事では、リアルタイム監視システムにおける WebSocket と JavaScript のアプリケーションを紹介し、コード例を示し、その実装原理を詳しく説明します。 1.WebSocketテクノロジー

株価分析に必須のツール: PHP と JS を使用してローソク足チャートを描画する手順を学びます 株価分析に必須のツール: PHP と JS を使用してローソク足チャートを描画する手順を学びます Dec 17, 2023 pm 06:55 PM

株式分析に必須のツール: PHP および JS でローソク足チャートを描画する手順を学びます。特定のコード例が必要です。インターネットとテクノロジーの急速な発展に伴い、株式取引は多くの投資家にとって重要な方法の 1 つになりました。株価分析は投資家の意思決定の重要な部分であり、ローソク足チャートはテクニカル分析で広く使用されています。 PHP と JS を使用してローソク足チャートを描画する方法を学ぶと、投資家がより適切な意思決定を行うのに役立つ、より直感的な情報が得られます。ローソク足チャートとは、株価をローソク足の形で表示するテクニカルチャートです。株価を示しています

Angular コンポーネントとその表示プロパティ: 非ブロックのデフォルト値について Angular コンポーネントとその表示プロパティ: 非ブロックのデフォルト値について Mar 15, 2024 pm 04:51 PM

Angular フレームワークのコンポーネントのデフォルトの表示動作は、ブロックレベルの要素ではありません。この設計の選択により、コンポーネント スタイルのカプセル化が促進され、開発者が各コンポーネントの表示方法を意識的に定義することが促進されます。 CSS プロパティの表示を明示的に設定することで、Angular コンポーネントの表示を完全に制御して、目的のレイアウトと応答性を実現できます。

JavaScript と WebSocket: 効率的なリアルタイム天気予報システムの構築 JavaScript と WebSocket: 効率的なリアルタイム天気予報システムの構築 Dec 17, 2023 pm 05:13 PM

JavaScript と WebSocket: 効率的なリアルタイム天気予報システムの構築 はじめに: 今日、天気予報の精度は日常生活と意思決定にとって非常に重要です。テクノロジーの発展に伴い、リアルタイムで気象データを取得することで、より正確で信頼性の高い天気予報を提供できるようになりました。この記事では、JavaScript と WebSocket テクノロジを使用して効率的なリアルタイム天気予報システムを構築する方法を学びます。この記事では、具体的なコード例を通じて実装プロセスを説明します。私たちは

PHP および JS 開発のヒント: 株価ローソク足チャートの描画方法をマスターする PHP および JS 開発のヒント: 株価ローソク足チャートの描画方法をマスターする Dec 18, 2023 pm 03:39 PM

インターネット金融の急速な発展に伴い、株式投資を選択する人がますます増えています。株式取引では、ローソク足チャートは一般的に使用されるテクニカル分析手法であり、株価の変化傾向を示し、投資家がより正確な意思決定を行うのに役立ちます。この記事では、PHP と JS の開発スキルを紹介し、株価ローソク足チャートの描画方法を読者に理解してもらい、具体的なコード例を示します。 1. 株のローソク足チャートを理解する 株のローソク足チャートの描き方を紹介する前に、まずローソク足チャートとは何かを理解する必要があります。ローソク足チャートは日本人が開発した

簡単な JavaScript チュートリアル: HTTP ステータス コードを取得する方法 簡単な JavaScript チュートリアル: HTTP ステータス コードを取得する方法 Jan 05, 2024 pm 06:08 PM

JavaScript チュートリアル: HTTP ステータス コードを取得する方法、特定のコード例が必要です 序文: Web 開発では、サーバーとのデータ対話が頻繁に発生します。サーバーと通信するとき、多くの場合、返された HTTP ステータス コードを取得して操作が成功したかどうかを判断し、さまざまなステータス コードに基づいて対応する処理を実行する必要があります。この記事では、JavaScript を使用して HTTP ステータス コードを取得する方法を説明し、いくつかの実用的なコード例を示します。 XMLHttpRequestの使用

See all articles