acl9:提前确定授权

时间:2009-12-21 09:55:45

标签: ruby-on-rails authorization acl9

我在其中一个项目的authlogic上使用了acl9。我喜欢这种方法acl9的方法,但我想我正在尝试做一些不那么简单的事情(不是说不可能)。

出于可用性的原因,我希望有一个内联管理面板。例如,我说我有资源拍卖和嵌套资源拍卖/出价。当普通用户在拍卖/ 1(1 = id)时,他应该看到“正常”的东西(描述,价格......),同一网站上的特权用户应该有额外的链接来编辑拍卖(=拍卖/ 1 /编辑)。这就是乐趣开始的地方。

也许我看起来不够近或在错误的地方,但我找不到确定当前用户是否有权进行编辑操作的方法。显然,我可以显示每个人的链接,让编辑操作拒绝普通用户,但这不是一个可行的选择。这里的错误是信息已经存在于系统中(参见下面的access_control块),我似乎无法找到使用它的方法。这在很多层面都不是干的。

 access_control do
  allow :privileged, :to => [:index, :show, :edit, :update]
  allow anonymous, :to => [:new, :show, :create]
 end

如果我想确定用户在auctions/1/bids/2/edit上拥有哪些权限,那就更糟了,因为这是一个完全不同的控制器。

如何提前访问该信息,然后决定是否显示要编辑的链接?这是不可能的(不改变acl9本身)还是我看起来不够努力? 是否有更好的符合我要求的授权插件?

1 个答案:

答案 0 :(得分:1)

通过“提前”访问它是什么意思?是否要为不同的用户呈现不同的模板,或者只是在模板中有条件隐藏/显示部分模板,具体取决于用户的访问级别?我相信它应该像在代码或模板中使用这样的东西一样简单:

if current_user.has_role?(:privileged)  
  # here goes the stuff that should be displayed to privileged user only  
end

如果您需要访问模板中的特定规则集(例如“我允许此用户访问编辑操作吗?”),则无法使用acl9执行此操作。而且我相信你不应该这样做,因为将你的业务逻辑和auth控制绑定到你的控制器似乎并不好 - 如果你决定明天重命名控制器,你的逻辑就会失败。但它可以看到两种解决方法。

  1. 将您的角色分成更详细的角色。例如,将“特权”拆分为“编辑器”,“创建者”,“删除器”等。因此,您可以使用这些较小的规则构建访问规则,并在模板中使用它们进行精细控制。

  2. 委派角色检查您的对象。这就是我通常在我的项目中执行的方式,因为它允许仅使用全局角色,并让模型决定是否允许用户对他们执行某些操作 - 例如if @auction.allows_edit_for?(current_user) {}。它需要对acl9进行几次覆盖,我前段时间已经在博客上发表过关于这种方法here