1

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

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

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

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

如果我想确定用户拥有哪些权限,情况会变得更糟,auctions/1/bids/2/edit因为这是在一个完全不同的控制器中。

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

4

1 回答 1

1

“提前”访问它是什么意思?您想为不同的用户呈现不同的模板,还是只在模板中添加条件来根据用户的访问级别隐藏/显示部分模板?我相信它应该像在代码或模板中包含这样的东西一样简单:

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

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

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

  2. 将角色检查委托给您的对象。这就是我通常在我的项目中这样做的方式,因为它只允许与全局角色一起工作,并让模型决定是否允许用户对他们做某事 - 例如if @auction.allows_edit_for?(current_user) {},。它需要对 acl9 进行一些覆盖,前段时间我已经在博客中介绍了这种方法

于 2009-12-23T22:22:16.633 回答