1

我有 4 个不同级别的访问权限;管理员、合作伙伴、员工和客户。Admin、Partner 和 Employee 对客户端具有管理访问权限。基本上我所做的是创建了一个 Rails 应用程序,客户可以在其中将文档上传给他们的供应商(合作伙伴)。除了客户端级别的访问之外,一切都很好。我有两个代码;partercode 和客户端代码。合作伙伴只能查看文件的 partercode 字段等于合作伙伴的合作伙伴代码的文件。这工作得很好。但是,客户端只能看到合作伙伴代码匹配且客户端代码匹配的文件。下面是我的客户部分。起作用的是客户端只允许查看partercode文件,但它正在设置它们查看属于合作伙伴的其他客户端。(通过在 URL 中输入数字)。我怀疑这永远不会是一个问题,但它

  role :client do
    has_permission_on [:users], :to => [:client, :edit, :update] do
      if_attribute :username => is { user.username }
    end
     has_permission_on [:documents], :to => [:client, :new, :create]
     has_permission_on [:documents], :to => [:client, :index, :show, :edit, :update, :destroy, :documents] do
       if_attribute :partnercode => is { user.partnercode }, :clientcode => is { user.clientcode }
     end
  end
4

3 回答 3

3

我不认为嵌套if_attribute语句实际上是这样工作的。默认情况下,Declarative_authorization 将这些if_attribute语句与or语句连接起来,但如果我理解正确,您希望它们与and. 改变它的方法是将:join_by属性设置为:and.

role :client do
  has_permission_on [:documents], :to => [:do_whatever], :join_by => :and do
    if_attribute :partnercode => is { user.partnercode }
    if_attribute :clientcode => is { user.clientcode }
  end
end

来源:http ://www.tzi.org/~sbartsch/declarative_authorization/master/classes/Authorization/Reader/AuthorizationRulesReader.html#M000184

于 2012-06-01T19:13:30.833 回答
0

我找到了答案。具有讽刺意味的是,答案就在这个问题的标签中。嵌套。

  role :client do
    has_permission_on [:users], :to => [:client, :edit, :update] do
      if_attribute :username => is { user.username }
    end
     has_permission_on [:documents], :to => [:client, :new, :create]
     has_permission_on [:documents], :to => [:client, :index, :show, :edit, :update, :destroy, :documents] do
       if_attribute :clientcode => is { user.clientcode } do
        if_attribute :partnercode => is { user.partnercode }
       end
     end
  end

一旦我验证客户端代码是正确的,然后创建另一个 do .. end 以检查合作伙伴代码。

于 2011-04-28T13:09:07.723 回答
0

:join_by有效,但我的问题是有时你需要ANDOR. 您可以在一行中指定多个 if 条件作为不同的参数。这些将使用 一起比较,AND而每行都使用 进行评估OR

role :client do
  has_permission_on [:documents], :to => [:do_whatever], :join_by => :and do
    if_attribute :partnercode => is { user.partnercode }, 
                 :clientcode => is { user.clientcode } # These two are evaluated with AND
    if_attribute :some_attr => is { some_val }
  end
end
于 2012-12-17T11:19:41.853 回答