权威从另一个角色继承

时间:2017-04-28 10:20:39

标签: ruby-on-rails devise pundit

我有一个使用Devise的Rails项目以及非常棒的Pundit Gem。我正在使用三种不同的角色--Superadmin,Admin和User。

我想知道是否有可能以某种方式定义superadmin拥有管理员拥有的所有权利以及更多权限。这样我就不必再在我的观点中写<% if current_user.admin? || current_user.superadmin? %>了。

1 个答案:

答案 0 :(得分:3)

您在视图中使用-n assume "while (<>) { ... }" loop around program -e program one line of program (several -e's allowed, omit programfile) 这一事实是一种特别臭的代码气味,表明您没有正确使用授权层。

您应该使用:

if current_user.admin? || current_user.superadmin?

在政策中定义规则 - 不要在整个地方传播授权逻辑(谁可以做什么)。

<% if policy(@post).update? %>
  <%= link_to "Edit post", edit_post_path(@post) %>
<% end %>

如果您使用的是像Rolify这样的角色库,您还可以通过赋予superadmins admin和superadmin角色来简化这一过程:

class ApplicationPolicy
  # ...
  def update?
    admin?
  end

  private 

  def admin?
    user.admin? || user.superadmin?
  end
end 

class PostPolicy < ApplicationPolicy
  def update?
    super || record.author == user
  end
end