我正在使用两层权限架构构建EmberJS应用。每个用户都有许多角色和工作区:
App.User = DS.Model.extend({
...
roles : DS.hasMany('role', {async: true}),
workspaces : DS.hasMany('workspace', {async: true}),
...
});
每个角色都有一组权限,属于工作区:
var Role = DS.Model.extend({
...
permissions : DS.attr(),
workspace : DS.belongsTo('workspace', {async: true}),
...
});
权限作为对象数组返回到Role模型:
permissions: [
{object:permission, id:prm_yRPZ1qlE, name:administrate, display_name:Administrate},
{object:permission, id:prm_QVPvJPry, name:projects.index, display_name:View All Projects},
{object:permission, id:prm_vxPdB7QE, name:projects.store, display_name:Create Project},
...
]
用户可以登录其中一个工作区,该工作区具有其他工作区的唯一权限。我需要做的是根据当前登录的工作区查询用户的功能。例如,用户可能已登录/workspace/:id/
,我需要能够执行this.userCan('View All Projects')
之类的操作,并让其查询当前工作区的权限。注意:我已将当前用户绑定到会话,因此执行this.get('session.user')
是轻而易举的。
理想情况下,我希望能够从任何路由或控制器查询用户的权限。 mixin是否可以作为此任务的合理选择,用户模型上的方法或效用函数是一个很好的解决方案吗?
答案 0 :(得分:1)
用户模型上的方法听起来像是最简单的解决方案。我看到的最大问题是您的角色是异步的。这意味着要么您需要保证角色已经存在,要么您的user.can('delete')
需要返回一个承诺,因为角色尚未得到解决。