我有4种不同的访问级别;管理员,合作伙伴,员工和客户。管理员,合作伙伴和员工对客户端具有管理访问权限。基本上我所做的是创建了一个Rails应用程序,客户端可以将文档上传到他们的供应商(合作伙伴)。除了客户端级访问外,一切都很好。我有两个代码; partercode和客户端代码。合作伙伴只能看到文件的partercode字段等于合作伙伴的合作伙伴代码的文件。这很好用。但是,客户端只能看到合作伙伴代码匹配且客户端代码匹配的文件。以下是我的客户部分。有效的是客户端IS只允许查看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
答案 0 :(得分: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
答案 1 :(得分: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以检查partnercode。
答案 2 :(得分:0)
:join_by
有效,但我的问题是有时您需要AND
和OR
。您可以在一行中指定多个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