私はBackboneとKnockoutとKnockback(ko + bbブリッジライブラリ)を使用してかなり大きなcmsタイプのアプリケーションを構築しており、アクセス許可を抽象化するための良い方法を見つけようとしています。また、小説を事前に申し訳ありません。
まず第一に、これはかなり非標準的なアーキテクチャであり、あなたが尋ねるかもしれない2番目の質問-EmberやAngularのようなより包括的なものを使用してみませんか?取ったポイント。それがこの時点でのことです。:)
これが私の悩みの種です。パーミッションのために、コントローラーレベルとビューモデルレベルの両方でエレガントなAPIが必要です。
次のようなオブジェクトを利用できます。
{
'api/pages': {
create: true, read: true, update: true, destroy: true
},
'api/links': {
create: false, read: true, update: false, destroy: false
}
...
}
そのため、ルーター/コントローラーで、コレクション/モデル/ビューモデルを更新し、既存のビューでカスタマイズされたレンダリングメソッドを呼び出しています。ビューは、ビューモデルのリリースなどを処理します。
initialize: function() {
this.pages = new PagesCollection();
this.links = new LinksCollection();
},
list: function() {
var vm = new PageListViewmodel(this.pages, this.links);
// adminPage method is available through inheritance
this.adminPage('path/to/template', vm); // delegates to kb.renderTemplate under the hood.
}
したがって、これに関する問題は、これらのコレクションが完全に構造化されていないことです。ルーターはそれらについて何も知りません。
しかし、私が必要としているのは、特定のリソースの表示が許可されていない場合に、許可されていないページにリダイレクトすることです。
上記の例では、フィルターの前後にコーディングすることを考えましたか?しかし、各ルーターメソッドがアクセスしようとしているものをどこで指定しますか?
list: function() {
this.authorize([this.pages, this.links], ['read'], function(pages, links) {
// return view.
});
}
前のコードは本当に不器用です。
より単純なビューモデルの場合、私は次のようなことを行うことを考えました-alaRubyのCanCan:
this.currentUser.can('read', collection) // true or false
// can() would just look at the endpoint and compare to my perms object.