2013-11-28 10 views
6

AngularJSアプリケーションのルートを定義する際に、各ルートにどのアクセスレベルを割り当てるべきかを示すために、accessという新しいプロパティが各ルートに追加されています。これは、hereと記載されているクライアント側の承認方法に基づいています。非同期データでAngularJSコンフィグブロックを初期化する

.configブロックは次のようになります。

app.config(['$routeProvider', '$locationProvider', '$httpProvider', 
    function ($routeProvider, $locationProvider, $httpProvider) { 

     var access = routingConfig.accessLevels; //Initialize with asynch data instead 

     $routeProvider. 
     when('/home', { 
      templateUrl: '/Templates/home.html', 
      controller: 'homeController', 
      access: access.user 
     }); 
     $routeProvider. 
     when('/private', { 
      templateUrl: '/Templates/private.html', 
      controller: 'adminController', 
      access: access.admin 
     }); 

     //...more route configurations 

    }]); 

脇アプローチのコアロジックを残して、私はそれように、我々はいくつかの非同期データとaccess変数を初期化する方法を一般的に知りたいです各ルートにaccessプロパティを定義している間に利用できますか?これは、サーバーだけがアクセス・レベルのリストを知っているために必要です。

ルートの設定でresolveを使用してサービス&でpromiseを暴露に基づいてInitialize AngularJS service with asynchronous dataへの回答がありますが、私はaccessので、ルート設定を定義する前に解決するために、非同期呼び出しを必要として、それは私の場合には動作しません。プロパティは非同期データに依存します。

どのようなオプションがありますか? promise/deferredのアプローチは引き続き何とか使用できますか?

ご提案いただければ幸いです。

EDIT:

ビットをやっていることaccess記述するために、それはroutingConfigと呼ばれる別のモジュールによって移入されています。 approachでは、ユーザーは2進数として定義された特定の役割に属します。たとえばpublic:001、user:010、admin:100(など)の場合

いずれのルートのアクセスレベルも、アクセスが許可されているすべてのユーザーロールのOR操作で定義された2進数になります。従って、例えば。ユーザロールuser(010)およびadmin(100)によってアクセスレベルにアクセスできる場合は、そのビットマスクは110になりますそれが許可されているかどうかを確認してください。上記のリンクに詳細があります。

さらに複雑なアルゴリズムではサーバー側のデータは安全であるため、クライアント側で上記のロジックを操作しても、そのようなユーザーは許可されていないページのマークアップしか見ることができません。

もう一度手元の問題に戻ります。 configブロックのプロパティとして使用されているaccessは、サーバーからの非同期データでどのように初期化できますか。このデータは、次のようになります。

accessLevels : { 
    'public' : '111', 
    'user' : '110', 
    'admin': '100' 
} 
+0

私はあなたがあなたがあなたの$ routeProvider 'でそれを使用するいくつかの理由で' access'をフェッチするサービスをテストしていると仮定していますあなたはあなたが更新値を持っていない 'access'を使って何があっても、それは失われてしまいます。これは私のための最初の見て奇妙に見えます。 –

+0

'access'を読み込むために必要な正確な情報を指定できますか(あるいは広範ないくつかのシナリオを説明してください)? (私はいくつかのアイディアを持っていますが、どれもエレガントではありません) –

+0

ここでの問題は、アプリケーションが実行される前に '$ routeProvider'が登録されていなければならないということです。これを処理する方法は、ルートをまったく同じにすることですが、 'module.run'関数で適切なアクセスレベルを設定し、UIを通してリンクにアクセスできないようにします。ユーザーがこれらのリンクにアクセスすると、アプリで401エラーが表示され、モーダルボックスを使用してより高い権限でログインするよう要求されます。これは '$ http'インターセプタ経由で処理されます。 –

答えて

2

私が正しくあなたを理解している場合accessが使用可能になるまでので、アプリケーションが応答しなくでなければなりません。とにかく、accessを非同期的に取得するポイントは何ですか?

たぶん、このようなアプローチは、[それがあるべき多くの似たようなケースでは確かに]適切である:

<script src="angular.js"></script> 
<script> 
angular.module('config').constant(
    <%= // JSON.stringify your config and access %> 
); 
</script> 
<script src="app.js"></script> 

あなたが本当にし、その後XHRHttpRequestまたは他の方法でaccessbootstrapアプリケーションをつかむ非同期それを行っている場合手動で

0

あなたがその間にあなたの問題を解決したかどうかはわかりませんが、以前は同じ問題に直面していました。私の解決策は、ng-appと一緒にhtmlタグのメインコントローラを使用することでした。コントローラの中で私は私のサーバから受け取ったアクセスレベルのデータを使用し、$routeの助けを借りてそこに私のルートを定義しました。したがって、ルート設定を定義する前にデータにアクセスできます。もちろん、コントローラー内にあるAuth工場からの約束thenの機能を呼び出して、そこでルートを定義することもできます。

ビュー:

<html ng-app="app" ng-controller="MainController"> 
... 
</html> 

コントローラ:

var MainController = ['$scope', '$http', '$route', 'Auth', function ($scope, $http, $route, Auth) { 
    var accessLevels = Auth.accessLevels; 

    $route.routes['/index'] = {templateUrl: "pages/index", controller: IndexController, access: accessLevels.guest}; 
    .... 
    $route.routes['null'] = {redirectTo: '/index', controller: IndexController}; 
関連する問題