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'
}
私はあなたがあなたがあなたの$ routeProvider 'でそれを使用するいくつかの理由で' access'をフェッチするサービスをテストしていると仮定していますあなたはあなたが更新値を持っていない 'access'を使って何があっても、それは失われてしまいます。これは私のための最初の見て奇妙に見えます。 –
'access'を読み込むために必要な正確な情報を指定できますか(あるいは広範ないくつかのシナリオを説明してください)? (私はいくつかのアイディアを持っていますが、どれもエレガントではありません) –
ここでの問題は、アプリケーションが実行される前に '$ routeProvider'が登録されていなければならないということです。これを処理する方法は、ルートをまったく同じにすることですが、 'module.run'関数で適切なアクセスレベルを設定し、UIを通してリンクにアクセスできないようにします。ユーザーがこれらのリンクにアクセスすると、アプリで401エラーが表示され、モーダルボックスを使用してより高い権限でログインするよう要求されます。これは '$ http'インターセプタ経由で処理されます。 –