我正在使用 Backbone 和 Knockout 和 Knockback(ko + bb 桥库)构建一个相当大的 cms 类型的应用程序,并且我正在尝试找出一种抽象权限的好方法。也提前为小说感到抱歉。
首先,这是一个非常非标准的架构,您可能会问第二个问题 - 为什么不使用更全面的东西,例如 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.
});
}
前面的代码真的很笨拙..
对于更直接的视图模型,我有做这样的事情的想法 - ala Ruby 的 CanCan:
this.currentUser.can('read', collection) // true or false
// can() would just look at the endpoint and compare to my perms object.