如何使用Pundit和Rolify限制在Ruby on Rails 4中访问模型

时间:2015-02-17 03:03:53

标签: ruby-on-rails-4 devise rolify pundit awesome-nested-set

在过去的几个月里,我刚刚跳过了Rails,并且在我目前的项目中碰到了我的第一个真正障碍,我一直无法找到答案。

我的目标是实现一些细粒度控制,从Rolify生成并由Pundit控制的用户角色/组可以通过Upmin管理控制台访问特定类别,子类别或文章。类别/文章应该能够允许多个用户角色/组访问其内容。

答案here演示了将角色作用于模型的特定实例,这很好,但我也希望通过我的应用程序管理控制台中的简单复选框形式从模型实例中获得该控件(对于那些感兴趣的人来说Upmin_admin)。

除了在管理控制台中创建类别/文章实例视图部分,列出所有角色/组及其当前CRUD设置之外,我认为生成此功能并不算太多。那个特定的类别/文章实例。或者我错过了一些中间步骤?

非常感谢正确方向的推动。 谢谢!

我的应用的一些背景

在我的网络应用程序中,我嵌套了资源,类别,文章和评论,如下所示:

resources :categories do
  resources :articles do
    resources :microposts, only: [:new, :create, :edit, :destroy
  end
end

(我知道嵌套资源不是best practice不是一个级别,但是我只是跳过Rails列车而且:shallow = true并没有提供结果我一直在寻找。)

这些类别充当嵌套集,由Awesome Nested Set提供,并且能够"持有"类别和文章(以及扩展评论)。

使用Devise通过LDAP服务器对用户进行身份验证 - 我将在不久的将来对其进行配置,以自动将用户分配到正确的组/角色。

1 个答案:

答案 0 :(得分:0)

重新阅读Rolify documentation我已经提出了问题解决方案的开头。

每当用户创建类别,子类别或文章时,我都会运行

user.add_role :current_role Model.Instance_id

然后我可以通过获取实例ID从管理门户查询。然后,通过查询系统中的所有用户角色并将它们与实例关联角色进行比较,我可以为管理控制台创建视图部分。

model_instance = Model.find(instance_id)
model_instance.roles #returns all of the roles associated with that instance

我还需要创建一些方法来处理角色的(大量)分配/重新分配,以便在选择(de)复选框时实现预期结果,例如向实例添加角色/组反之亦然。可能是某些东西(红宝石味的伪代码跟随!!)

users = User.with_any_role(:some_role)

def assignRoleToModel(model_instance, users, role)
  if model_instance.roles.empty?
    users.each { |u| u.add_role creatorRole model_instance }
  end
  flash[:warning] = "#{Model_instance.name} already has that role assigned to it!"
end

其中model_instance是我想控制组/角色访问的模型的实例,users是具有我想要添加到model_instance的角色的用户列表,而role是我希望允许访问的角色model_instance。

<强>更新

如何通过表单https://github.com/RolifyCommunity/rolify/issues/246

控制角色的示例