我在我的一个项目中使用了acl9,而不是authlogic。我喜欢这种方法,acl9的方法,但我猜我正在尝试做一些不那么简单的事情(不是说不可能)。
出于可用性的原因,我想有一个内联管理面板。例如,假设我得到了一个资源拍卖和一个嵌套的资源拍卖/出价。当普通用户在auctions/1 (1=id)上时,他应该看到“正常”内容(描述,价格...),同一站点上的特权用户应该有额外的链接来编辑拍卖(= auctions/1/edit)。这就是有趣的开始。
也许我看得不够近,或者在错误的地方,但我找不到方法来确定我的当前用户是否被授权进行编辑操作。显然,我可以向每个人显示链接,并让编辑操作拒绝普通用户,但这不是一个可行的选择。这里让我困扰的是,信息已经在系统中(参见下面的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本身),还是我看得不够认真?有没有更符合我要求的授权插件?
发布于 2009-12-24 06:22:17
你说“提前”访问是什么意思?您是想为不同的用户呈现不同的模板,还是只想在模板中使用条件来根据用户的访问级别隐藏/显示模板的一部分?我相信它应该像在代码或模板中包含如下内容一样简单:
if current_user.has_role?(:privileged)
# here goes the stuff that should be displayed to privileged user only
end如果您需要访问模板中的特定规则集(如“我是否允许此用户访问编辑操作?”)你不能用acl9做到这一点。我相信你无论如何都不应该这样做,因为将你的业务逻辑和身份验证控制绑定到你的控制器上似乎并不好--如果你决定明天重命名控制器,你的逻辑就会失败。但它可以看到两种方法来解决它。
if @auction.allows_edit_for?(current_user) {}。它需要对acl9进行几次重写,不久前我曾在博客here中介绍过这种方法。https://stackoverflow.com/questions/1939206
复制相似问题