查询路由,控制器和视图中的复杂用户权限

时间:2014-09-09 23:42:00

标签: ember.js permissions

我正在使用两层权限架构构建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是否可以作为此任务的合理选择,用户模型上的方法或效用函数是一个很好的解决方案吗?

1 个答案:

答案 0 :(得分:1)

用户模型上的方法听起来像是最简单的解决方案。我看到的最大问题是您的角色是异步的。这意味着要么您需要保证角色已经存在,要么您的user.can('delete')需要返回一个承诺,因为角色尚未得到解决。